Используйте np.where
, чтобы получить индексы строк, столбцов, а затем используйте те, у которых np.split
, чтобы получить список индексов столбцов в качестве выходных данных массивов -
In [18]: r,c = np.where(X>0.6)
In [19]: np.split(c,np.flatnonzero(r[:-1] != r[1:])+1)
Out[19]: [array([2]), array([1, 2]), array([0, 1, 3]), array([2]), array([3, 4])]
Чтобы сделать его более универсальным, который будет обрабатывать строки без какого-либо соответствия, мы могли бы перебрать индексы столбцов, полученные из np.where
, и назначить их в инициализированный массив, например:
def col_indices_per_row(X, thresh):
mask = X>thresh
r,c = np.where(mask)
out = np.empty(len(X), dtype=object)
grp_idx = np.r_[0,np.flatnonzero(r[:-1] != r[1:])+1,len(r)]
valid_rows = r[np.r_[True,r[:-1] != r[1:]]]
for (row,i,j) in zip(valid_rows,grp_idx[:-1],grp_idx[1:]):
out[row] = c[i:j]
return out
Пробный прогон -
In [92]: X
Out[92]:
array([[0.16, 0.4 , 0.61, 0.48, 0.2 ],
[0.42, 0.79, 0.64, 0.54, 0.52],
[0.1 , 0.1 , 0.1 , 0.1 , 0.1 ],
[0.33, 0.54, 0.61, 0.43, 0.29],
[0.25, 0.56, 0.42, 0.69, 0.62]])
In [93]: col_indices_per_row(X, thresh=0.6)
Out[93]:
array([array([2]), array([1, 2]), None, array([2]), array([3, 4])],
dtype=object)