这是一个布尔数组
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
,依此类推,直到我们耗尽所有列。通过将到目前为止收集的所有索引汇总在一起,应该可以得到结果数组。
我有一个循环的解决方案,但非常希望使用向量化的解决方案。我们该如何处理?任何最初的想法都会有很大帮助。
答案 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]