【问题标题】:Average two rows in Python while ignoring NaN忽略 NaN 在 Python 中平均两行
【发布时间】:2012-09-03 23:16:33
【问题描述】:

我有一个二维数据数组。我需要平均每两行,并返回一个高度为一半的数组的平均值。为了平均目的,我还需要忽略所有 NaN 值。例如:

>>> x = numpy.array([[ 1,  nan,  3,  4,  5],
... [ 6,  7,  8,  9, nan],
... [11, 12, 13, 14, nan],
... [16, nan, 18, 19, nan]])

并且函数需要返回:

>>> x
array([[3.5,  7,  5.5,  6.5,  5],
[13.5, 12, 15.5, 16.5, nan]])

【问题讨论】:

  • numpy 有masked array,我认为您可以指定 np.nan 作为掩码,然后应用平均操作。
  • +1:问题有点本地化,但至少在预期的输入和输出方面清晰简洁。

标签: python arrays numpy average mean


【解决方案1】:

这应该可以解决问题:

numpy.ma.average(numpy.ma.masked_invalid(x).reshape(-1, 2, x.shape[-1]), 1)

对我来说它返回

masked_array(data =
 [[3.5 7.0 5.5 6.5 5.0]
 [13.5 12.0 15.5 16.5 --]],
             mask =
 [[False False False False False]
 [False False False False  True]],
       fill_value = 1e+20)

【讨论】:

  • 向 yosukesabai 提出建议 masked_array
  • 这正是我想要的,非常感谢。今年夏天刚开始学Python,还有很长的路要走!
  • 嗯,我收到了array([[ 3.5, nan, 5.5, 6.5, nan], [ 13.5, nan, 15.5, 16.5, nan]]),但不知道出了什么问题
  • 将我的输出添加到答案中。我不知道为什么你会得到不同的输出。我正在使用 python 2.6 和 numpy 1.3.0。
  • numpy.savetxt 似乎不适用于掩码数组。使用x.filled(numpy.NaN) 转换回具有显式NaN 值的普通数组,然后将其传递给numpy.savetxt。
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 2014-09-03
  • 2017-08-20
  • 1970-01-01
  • 2022-01-07
  • 2018-07-05
  • 2018-06-22
相关资源
最近更新 更多