替换包含NaN的numpy数组中的值

3
aa = np.array([2.0, np.NaN])
aa[aa>1.0] = np.NaN

运行上述代码时,我收到以下警告。我理解这个警告的原因,但如何避免呢? 运行时警告:在大于符号中出现无效值

你想要在numpy数组中替换NaN值还是只是消除RuntimeWarning?如果是后者,np.seterr(invalid='ignore')就足够了。参考这个问题 - gzc
1个回答

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])

1
在Py3中,与np.nan进行比较会产生False而不会出现警告。 - hpaulj
这对多维数组有效吗?我得到错误,因为idx使用线性索引。 - Darcy
1
@Darcy 对于多维数组,你需要使用np.where来获取所有维度的索引,然后使用这些索引进行索引和赋值。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接