是否可以在不迭代数组或屏蔽数组的情况下获取 numpy 数组中非零元素的长度。速度是计算长度的主要目标。
本质上,类似len(array).where(array != 0)
.
如果它改变了答案,每一行都将从零开始。数组在对角线上用零填充。
假设您的意思是非零元素的总数(而不是非零行的总数):
In [12]: a = np.random.randint(0, 3, size=(100,100))
In [13]: timeit len(a.nonzero()[0])
1000 loops, best of 3: 306 us per loop
In [14]: timeit (a != 0).sum()
10000 loops, best of 3: 46 us per loop
甚至更好:
In [22]: timeit np.count_nonzero(a)
10000 loops, best of 3: 39 us per loop
最后一个 ,count_nonzero
似乎在数组很小的时候也表现得很好,而sum
诀窍不是那么多:
In [33]: a = np.random.randint(0, 3, size=(10,10))
In [34]: timeit len(a.nonzero()[0])
100000 loops, best of 3: 6.18 us per loop
In [35]: timeit (a != 0).sum()
100000 loops, best of 3: 13.5 us per loop
In [36]: timeit np.count_nonzero(a)
1000000 loops, best of 3: 686 ns per loop
len(np.nonzero(array)[0])
?
np.nonzero
返回一个索引元组,其长度等于初始数组中的维数[0]
len