我试图用另一个数组中的值填充数组中的nan
值。由于我正在处理的数组是1-D np.where不起作用。但是,按照documentation中的提示,我尝试了以下内容:
import numpy as np
sample = [1, 2, np.nan, 4, 5, 6, np.nan]
replace = [3, 7]
new_sample = [new_value if condition else old_value for (new_value, condition, old_value) in zip(replace, np.isnan(sample), sample)]
然而,相反输出我期望[1, 2, 3, 4, 5, 6, 7]
我得到:
[Out]: [1, 2]
我做错了什么?
答案 0 :(得分:2)
np.where
有效
In [561]: sample = np.array([1, 2, np.nan, 4, 5, 6, np.nan])
使用isnan
标识nan
值(不要使用==
)
In [562]: np.isnan(sample)
Out[562]: array([False, False, True, False, False, False, True])
In [564]: np.where(np.isnan(sample))
Out[564]: (array([2, 6], dtype=int32),)
其中一个,布尔值或where元组可以索引nan
值:
In [565]: sample[Out[564]]
Out[565]: array([nan, nan])
In [566]: sample[Out[562]]
Out[566]: array([nan, nan])
并用于替换:
In [567]: sample[Out[562]]=[1,2]
In [568]: sample
Out[568]: array([1., 2., 1., 4., 5., 6., 2.])
三个参数也有效 - 但会返回一个副本。
In [571]: np.where(np.isnan(sample),999,sample)
Out[571]: array([ 1., 2., 999., 4., 5., 6., 999.])
答案 1 :(得分:1)
您可以使用numpy.argwhere
。但@hpaulj表明numpy.where
同样有效。
import numpy as np
sample = np.array([1, 2, np.nan, 4, 5, 6, np.nan])
replace = np.array([3, 7])
sample[np.argwhere(np.isnan(sample)).ravel()] = replace
# array([ 1., 2., 3., 4., 5., 6., 7.])