Python Numpy 非零元素
我有一个形状为 (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%,那么 len(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 ]