我想从二维数组中按列获取真值的行索引。到目前为止,我有一个for循环的解决方案。但我认为这不是有效的,因为存在python原生for循环。但我没能找到解决办法。在
更新:不必是矢量化的解决方案,效率越高越好。在
arr = np.random.randint(2, size=15).reshape((3,5)).astype(bool)
print arr
[[ True False True False True]
[False True False True True]
[ True True False False True]]
def calc(matrix):
result = []
for i in range(matrix.shape[1]):
result.append(np.argwhere(matrix[:, i]).flatten().tolist())
return result
print calc(arr)
[[0, 2], [1, 2], [0], [1], [0, 1, 2]]
注意:我希望行索引按列分组。当一列都为False时,我需要得到一个空列表[]
,而不是跳过。在
我的解决办法是
这比@Divakar提出的要慢一点。不过,我发现它更具可读性,因为可以避免复杂的
np.flatnonzero(r[1:] != r[:-1])+1
部分,因此可以立即清楚地看到发生了什么。在方法1
这里有一个矢量化NumPy方法,可以将这些行索引分组到数组列表中-
样本运行-
^{pr2}$方法2
或者,我们可以使用
loop comprehension
来避免这种分裂-我们正在使用方法1中的
r,c
。在方法3(为所有0col输出空列表/数组)
为了解释所有的零列,我们需要空列表/数组,这里有一个改进的方法-
我们正在使用方法1中的
c
。在样本运行-
方法4
这里有另一种处理所有
0s
cols的方法-我们正在使用方法1中的
r,c
。在相关问题 更多 >
编程相关推荐