np.where相当于1-D阵列

时间:2018-04-05 15:07:25

标签: python arrays numpy

我试图用另一个数组中的值填充数组中的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]

我做错了什么?

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