data = np.array([[1, 0,-1, 0, 0, 1, 0,-1, 0, 0, 1],
[1, 1, 0, 0,-1, 0, 1, 0, 0,-1, 0],
[1, 0, 0, 1, 0, 0,-1, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0]])
a = data
Подсчет последовательных нулей в каждой строке:
Numpy и Python l oop (s).
Итерация по строкам; найти индексы нулей; разбить строку, где индексы отличаются более чем на один; получить формы результата.
for row in a:
zeros = np.where(row==0)[0]
neighbors = (np.argwhere(np.diff(zeros)>1)+1).ravel()
w = np.split(zeros,neighbors)
counts = [thing.shape[0] for thing in w]
print(counts)
Индексы шаблона:
Использует некоторое вещание - работает со всеми строками за один раз при выполнении итерации по столбцам
# pattern to search for:
# notzero,zero,zero,notzero,zero,notzero,zero,zero,notzero
pattern = np.array([False,True,True,False,True,False,True,True,False])
# find zeros in data and pad
padded = np.pad(a==0,1)
dif = padded.shape[1] - pattern.shape[0]
for i in range(dif+1):
stop = i+pattern.shape[0]
test = padded[:,i:stop]
equal = test == pattern
equal = np.all(equal,1)
if any(equal):
row = np.argwhere(equal).ravel()[0]
print(f'[{row-1},{i+3}]')
Это должно найти несколько ( разделенных и перекрывающихся) шаблонов подряд - похоже, работает с:
data = np.array([[1, 0,-1, 0, 0, 1, 0,-1, 0, 0, 1, 0,-1, 0, 0, 1,-1, 0, 0, 1, 0,-1, 0, 0],
[1, 1, 0, 0,-1, 0, 1, 0, 0,-1, 0, 1, 0, 0,-1, 0, 0, 0,-1, 0, 1, 0, 0,-1],
[1, 0, 0, 1, 0, 0,-1, 0, 1, 0, 0,-1, 0, 1, 0, 0, 0, 1, 0, 0,-1, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]])