我们如何找到布尔数组中沿轴1存在“真”值的索引?

时间:2019-05-18 20:29:32

标签: python numpy multidimensional-array boolean numpy-ndarray

这是一个布尔数组

In [102]: arr        
Out[102]: 
array([[0, 1, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [1, 0, 0, 0],
       [1, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 1]], dtype=uint8)

我想沿轴1上有一个1的位置计算索引,然后停下来再进行下一列,直到我耗尽所有列。因此,预期的解决方案将是:

array([ 1,  4,  5,  6,  0,  7,  8,  2,  9, 10,  3, 11, 12])

要进一步说明如何获得上述结果:我们从第1列开始并沿轴1下降,然后在索引1遇到1,然后在索引{{1 }},以此类推,直到在该列中位置4遇到最后一个1为止。因此,我们将停止在该列的其​​余部分,因为将不再有6,然后继续到第二列,在索引1我们遇到1,依此类推,直到我们耗尽所有列。通过将到目前为止收集的所有索引汇总在一起,应该可以得到结果数组。

我有一个循环的解决方案,但非常希望使用向量化的解决方案。我们该如何处理?任何最初的想法都会有很大帮助。

4 个答案:

答案 0 :(得分:2)

In [134]: arr=np.array([[0, 1, 0, 0], 
     ...:        [1, 0, 0, 0], 
     ...:        [0, 0, 1, 0], 
     ...:        [0, 0, 0, 1], 
     ...:        [1, 0, 0, 0], 
     ...:        [1, 0, 0, 0], 
     ...:        [1, 0, 0, 0], 
     ...:        [0, 1, 0, 0], 
     ...:        [0, 1, 0, 0], 
     ...:        [0, 0, 1, 0], 
     ...:        [0, 0, 1, 0], 
     ...:        [0, 0, 0, 1], 
     ...:        [0, 0, 0, 1]], dtype=np.uint8)   

在转置上看起来像where会找到所需的索引:

In [135]: np.where(arr.T)                                                    
Out[135]: 
(array([0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]),
 array([ 1,  4,  5,  6,  0,  7,  8,  2,  9, 10,  3, 11, 12]))
In [136]: np.where(arr.T)[1]                                                 
Out[136]: array([ 1,  4,  5,  6,  0,  7,  8,  2,  9, 10,  3, 11, 12])

答案 1 :(得分:-1)

您应该尝试使用python中的numpy库 它非常有效且易于使用。

v = [[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]];
import numpy as np
flattenedArray = np.array(v).ravel()

print flattenedArray
for i in range(len(flattenedArray)):
if flattenedArray[i]>0:
       print i

答案 2 :(得分:-1)

就像上面说的那样。如果您想要向量形式的解决方案,那么numpy是最佳选择。

import numpy as np
arr = arr.transpose()
y = np.arange(arr.shape[0])
result =  list(map(lambda j: y[j==1], x))   
result = np.concatenate(result)

诀窍是使用单独的数组y根据条件过滤索引。

答案 3 :(得分:-1)

您可以将matrix作为输入来执行此操作:

result = [i for i,x in enumerate(matrix.transpose().flatten()) if x == 1]