Python NumPy非零元素

5

我有一个形状为(31641600,2)的numpy数组,其中可能有许多零值。

我们称该数组为X。

执行:

print len(X)
>>> 31641600

但是,接下来要做的是:

X = X[np.nonzero(X)]
print len(X)
>>> 31919809

不明白为什么第二个值更大。在文档中,它说采用以上方法应该只返回非零值,因此X的长度应该更小。有任何想法吗?谢谢。
1个回答

5
这可能是因为len(X)仅返回X沿第一个轴的长度。当你执行以下操作时:
X = X[np.nonzero(X)]

您会得到一个一维数组,如果在X中少于50%的数为零,则X的长度将增加。

考虑以下例子:

In [1]: import numpy as np

In [2]: X = np.zeros((42, 2))

In [3]: X[:, 0] = 1

In [4]: X[0, 1] = 1

In [5]: len(X)
Out[5]: 42

In [6]: len(X[np.nonzero(X)])
Out[6]: 43

这是因为 X[np.nonzero(X)] 是一个由43个1组成的数组:

In [7]: X[np.nonzero(X)].shape
Out[7]: (43,)

回应评论中的更新: 如果您确实想要所有第一个元素为非零的对,您可以执行以下操作:

X = X[ X[:, 0] != 0 ]

哈哈,不错!我之前不知道这个!我的基本目标是要清除数组中所有非零条目。我的(x,y)值表示某些运动向量的大小和角度,只需要丢弃所有0大小以及相关的角度即可。 - Claudiu S
@ClaudiuS 然后你可以使用花式索引而不是 nonzero。我已经更新了答案。 - Lev Levitsky
我只能接受你的答案并表示感谢 :) 我一直在研究布尔索引,但是做错了。再次感谢。 - Claudiu S
没问题 @ClaudiuS :) - Lev Levitsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接