I search my ndArray to find longest series based on True values. Is there an option to find longest series without looping through array?
I've already wrote my own solution with numpy.nonzero, but there is probably better one.
import numpy as np
arr = np.array([[[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]],
[[True,True,True,False,True],
[True,True,True,True,False],
[True,True,False,True,True],
[True,True,True,False,True],
[True,True,True,False,True]]])
def getIndices(arr):
arr_to_search = np.nonzero(arr)
arrs = []
prev_el0 = 0
prev_el1 = -1
activ_long = []
for i in range(len(arr_to_search[0])):
if arr_to_search[0][i] == prev_el0:
if arr_to_search[1][i] != prev_el1 + 1:
arrs.append(activ_long)
activ_long = []
else:
arrs.append(activ_long)
activ_long = []
activ_long.append((arr_to_search[0][i],arr_to_search[1][i]))
prev_el0 = arr_to_search[0][i]
prev_el1 = arr_to_search[1][i]
max_len = len(max(arrs,key=len))
longest_arr_list = [a for a in arrs if len(a) == max_len]
return longest_arr_list
print(getIndices(arr[1,:,:]))
print(getIndices(arr[1,:,:].T))
[[(1, 0), (1, 1), (1, 2), (1, 3)]]
[[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4)], [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4)]]