Python Numpy 非零元素

5 投票
1 回答
2347 浏览
提问于 2025-04-18 11:03

我有一个形状为 (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 ]

撰写回答