1

可能重复:
NumPy:计算移除 NaN 的平均值

我有几个形状相同的 numpy 数组。我想用一个小的扭曲来取他们的逐点平均值:在np.nan平均值中应该忽略一个值。换句话说,average(np.array([1,2,3]), np.array([5,np.nan,7]), np.array([np.nan, 4, 2])应该等于np.array([3,3,4])

当然,我可以通过遍历每个 numpy 数组中的元素来做到这一点,但我希望避免它。有没有更好的方法来实现这个功能?

(Python 3,但我怀疑它是否重要。)

4

2 回答 2

4

您可以使用scipy.stat's nanmean

import numpy as np
from scipy.stats import nanmean
s = np.array([[1.0, 2.0, 3.0], [5.0, np.nan, 7.0], [np.nan, 4.0, 2.0]])

In [4]: nanmean(s)
Out[4]: array([ 3.,  3.,  4.])

@Dougal 在评论中指出,该bottleneck包对几个 numpy/scipy 函数的实现速度明显加快,包括一个nanmean.

于 2012-12-09T23:12:51.027 回答
1

您还可以将数组转换为屏蔽数组(使用fix_invalid屏蔽所有 NaN )并在那里执行操作:

new_array = np.ma.fix_invalid(my_array)
print np.mean(new_array)

如果只是平均水平,那么nanmean@hayden 建议的速度大约快 4 倍。但是,如果您想对数组进行其他操作,最好使用掩码数组。

于 2012-12-09T23:50:41.000 回答