aa = np.array([2.0, np.NaN])
aa[aa>1.0] = np.NaN
运行上述代码时,我收到以下警告。我理解这个警告的原因,但如何避免呢?
运行时警告:在大于符号中出现无效值
存储有效索引(非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])
np.nan
进行比较会产生False而不会出现警告。 - hpauljidx
使用线性索引。 - Darcynp.where
来获取所有维度的索引,然后使用这些索引进行索引和赋值。 - Divakar
RuntimeWarning
?如果是后者,np.seterr(invalid='ignore')
就足够了。参考这个问题。 - gzc