【发布时间】:2017-08-12 11:34:51
【问题描述】:
我需要计算numpy 数组中零元素的数量。我知道 numpy.count_nonzero 函数,但似乎没有用于计算零元素的模拟。
我的数组不是很大(通常少于 1E5 个元素),但操作执行了几百万次。
我当然可以使用len(arr) - np.count_nonzero(arr),但我想知道是否有更有效的方法。
这是我目前如何做的 MWE:
import numpy as np
import timeit
arrs = []
for _ in range(1000):
arrs.append(np.random.randint(-5, 5, 10000))
def func1():
for arr in arrs:
zero_els = len(arr) - np.count_nonzero(arr)
print(timeit.timeit(func1, number=10))
【问题讨论】:
-
count_nonzero是一个非常基本的编译操作。无论您想知道零的数量还是非零的数量,您仍然需要遍历整个数组。让 numpy 在编译后的代码中做到这一点,不用担心效率。 -
为什么你认为
len(arr) - np.count_nonzero(arr)效率低? -
count_nonzero 和潜在的 count_zero 之间的差异是一个减法。这与您将获得的效率差不多。
-
@juanpa.arrivillaga
len(arr)是通过函数调用进行的属性查找。纯属性查找a.size花费的时间减少了 25%。 -
@DYZ 是的,无论如何你都应该使用
a.size,特别是因为len(a)会给多维数组提供错误的答案。但我认为这不是 OP 所指的......
标签: python arrays performance numpy multidimensional-array