下記の二次元配列のインプットデータに対して、縦横に隣接する数字の塊を一つとしてカウントするコードを三重ループを利用せずにかきたいと思っています。
例えば、4という数字は、4つの塊があります。 5という数字は、1つしかないので1つの塊です。
もし、こうできそう、この辺リファクタできるとよくなりそうなどのアドバイス頂けますと助かります。
input data
python
1A = [ 2 [5,4,4], 3 [4,3,4], 4 [3,2,4], 5 [2,2,2], 6 [3,3,4], 7 [1,4,4], 8 [4,1,1] 9]
output data
11
コード
python
1# calculate max values 2import numpy as np 3max_value = np.amax(A) +1 # 5
python
1# mapping the indexies of each value 2r_length = len(A[0]) 3c_length = len(A) 4 5map = {} 6for n in range(1,max_value): 7 ind = [] 8 for i in range(c_length): # 行 9 for j in range(r_length): # 列 10 if A[i][j] == n: 11 ind.append([j, i]) 12 map[n] = ind 13 14# map 15#{1: [[0, 5], [1, 6], [2, 6]], 16# 2: [[1, 2], [0, 3], [1, 3], [2, 3]], 17# 3: [[1, 1], [0, 2], [0, 4], [1, 4]], 18# 4: [[1, 0], [2, 0], [0, 1], [2, 1], [2, 2], [2, 4], [1, 5], [2, 5], [0, 6]], 19# 5: [[0, 0]]}
python
1count = 0 2for v in map.values(): 3 length = len(v) 4 static_length = len(v) 5 for i in range(1, static_length): 6 first = v[i-1] 7 dynamic_length = len(v[i:]) 8 for i in range(1, dynamic_length): 9 next = v[i] 10 if first[0] == next[0]: 11 if first[1] == next[1] + 1 or first[1] == next[1] - 1: 12 length -= 1 13 14 if first[1] == next[1]: 15 if first[0] == next[0] + 1 or first[0] == next[0] - 1: 16 length -= 1 17 18 if first[0] == next[1]: 19 if first[1] == next[0] + 1 or first[1] == next[0] - 1: 20 length -= 1 21 22 if first[1] == next[0]: 23 if first[0] == next[1] + 1 or first[0] == next[1] - 1: 24 length -= 1 25 26 count+=length 27 28# count 29# 11