【问题标题】:Replace values in numpy array containing NaN替换包含 NaN 的 numpy 数组中的值
【发布时间】:2016-12-16 20:44:50
【问题描述】:
aa = np.array([2.0, np.NaN])
aa[aa>1.0] = np.NaN

在运行上面的代码时,我明白了。警告,我明白这个警告的原因,但是如何避免呢?

RuntimeWarning: invalid value encountered in greater

【问题讨论】:

  • 你想替换 numpy 数组中的 NaN 值还是仅仅消除 RuntimeWarning?如果是后者,np.seterr(invalid='ignore') 就足够了。参考这个question

标签: python numpy nan


【解决方案1】:

存储有效索引(非 NaN)。首先,我们将使用这些索引来索引数组并执行比较以获得掩码,然后再次使用该掩码索引这些索引以检索与原始顺序相对应的索引。使用原始排序的索引,我们可以将输入数组中的元素分配给NaNs

因此,实现/解决方案将是 -

idx = np.flatnonzero(~np.isnan(aa))
aa[idx[aa[idx] > 1.0]] = np.nan

示例运行 -

In [106]: aa  # Input array with NaNs
Out[106]: array([  0.,   3.,  nan,   0.,   9.,   6.,   6.,  nan,  18.,   6.])

In [107]: idx = np.flatnonzero(~np.isnan(aa)) # Store valid indices

In [108]: idx
Out[108]: array([0, 1, 3, 4, 5, 6, 8, 9])

In [109]: aa[idx[aa[idx] > 1.0]] = np.nan # Do the assignment

In [110]: aa #  Verify
Out[110]: array([  0.,  nan,  nan,   0.,  nan,  nan,  nan,  nan,  nan,  nan])

【讨论】:

  • 在 Py3 中,与 np.nan 的比较会产生 False 而没有警告。
  • 这对多维数组有效吗?我收到错误是因为 idx 使用线性索引。
  • @Darcy 对于多维度数组,您需要使用np.where,它会为我们提供所有维度的索引,然后使用这些索引和分配。
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2013-09-12
  • 2021-06-20
  • 2018-07-12
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多