点状阵列平均忽略NaN

时间:2012-12-09 23:04:37

标签: python numpy

  

可能重复:
  NumPy: calculate averages with NaNs removed

我有几个形状相同的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,但我怀疑这很重要。)

2 个答案:

答案 0 :(得分:4)

您可以使用scipy.statnanmean

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软件包包含nanmean几个numpy / scipy函数的速度要快得多。

答案 1 :(得分:1)

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

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

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