我有几个形状相同的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,但我怀疑这很重要。)
答案 0 :(得分:4)
您可以使用scipy.stat
的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
软件包包含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倍。但是如果你想对阵列进行其他操作,那么最好使用掩码数组。