【发布时间】:2018-01-16 07:34:19
【问题描述】:
我在 Python 的 numpy. ma.average 比 arr.mean 慢很多(arr 是一个数组)
>>> arr = np.full((3, 3), -9999, dtype=float)
array([[-9999., -9999., -9999.],
[-9999., -9999., -9999.],
[-9999., -9999., -9999.]])
%timeit np.ma.average(arr, axis=0)
The slowest run took 49.32 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 191 µs per loop
%timeit arr.mean(axis=0)
The slowest run took 6.63 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 7.41 µs per loop
随机数
arr = np.random.random((3,3))
%timeit arr.mean(axis=0)
The slowest run took 6.17 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 7.78 µs per loop
%timeit np.ma.average(arr, axis=0)
1000 loops, best of 3: 186 µs per loop
--> 慢了将近 24 倍。
文档
numpy.ma.average(a, axis=None, weights=None, returned=False)返回给定轴上数组的
weighted平均值。
numpy.mean(a, axis=None, dtype=None, out=None, keepdims)计算沿指定轴的算术平均值。
为什么ma.average 比arr.mean 慢这么多?在数学上它们是相同的(如果我错了,请纠正我)。我的猜测是它与ma.average 上的加权选项有关,但如果没有通过权重,不应该有后备吗?
【问题讨论】:
-
Masked operations(你看到
.ma.?)很慢! -
进一步对少量数据进行测试不是一个好习惯:7.78us 和 186us 之间有什么区别?不多。您需要使用更大的矩阵。
-
;) 谢谢,没想到。无论如何,给定数组上没有掩码。在旧代码中找到它,该代码曾经在那里有一个掩码数组。
-
(可能)不重要。不同的计算模型。比较
np.mean和np.average(两个非掩码函数)并使用更大的数据! -
@mumbala:我知道。我只是说,将来,您最好发布大批量的测试结果。如果这里的
ma.average会重定向到np.mean(它不会),那么即使重定向也会产生巨大的影响。
标签: python performance numpy average mean