获取numpy数组中非零元素的数量?

时间:2012-09-17 00:43:56

标签: python numpy

是否可以在numpy数组中获取非零元素的长度,而无需迭代数组或屏蔽数组。速度是计算长度的主要目标。

基本上,像len(array).where(array != 0)

如果它改变了答案,则每行将以零开头。数组用零填充在对角线上。

2 个答案:

答案 0 :(得分:16)

假设您的意思是非零元素的总数(而不是非零行的总数):

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

答案 1 :(得分:3)

len(np.nonzero(array)[0])

  • np.nonzero返回一个索引元组,其长度等于初始数组中的维数
  • 我们只使用[0]
  • 获得第一维的索引
  • 使用len
  • 计算其长度