【问题标题】:Pointwise array average ignoring NaN [duplicate]忽略NaN的逐点数组平均值[重复]
【发布时间】:2012-12-10 07:50:41
【问题描述】:

可能重复:
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,但我怀疑它是否重要。)

【问题讨论】:

  • 你想要的已经在这里回答了:stackoverflow.com/questions/5480694/…
  • @HerrKaputt 抱歉,它确实...我以某种方式说服自己没有人会尝试这样做,所以我没有仔细搜索现有问题:(
  • 不用道歉!事实上,我认为其他链接中没有提到海登的答案(使用 nanmean)......

标签: python numpy


【解决方案1】:

你可以使用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 在 cmets 中指出,bottleneck 包包含一个 nanmean,它对几个 numpy/scipy 函数的实现速度明显加快。

【讨论】:

  • 请注意,the bottleneck packagebottleneck.nanmean,在他们的测试中运行速度比 scipy.stats.nanmean 快 10-30 倍。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 2014-09-03
    • 2017-12-28
    • 2021-01-10
    • 2018-09-15
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多