Python 如何用另一个列表中的元素替换numpy数组中的nan
我面临着一个基本替换的问题。我有两个数组,其中一个包含数字和NaN,另一个是用来替换NaN的数字,显然是按照我的意愿排序的。例如:Python 如何用另一个列表中的元素替换numpy数组中的nan,python,python-3.x,numpy,Python,Python 3.x,Numpy,我面临着一个基本替换的问题。我有两个数组,其中一个包含数字和NaN,另一个是用来替换NaN的数字,显然是按照我的意愿排序的。例如: x1=[NaN,2,3,4,5,NaN,7,8,NaN,10]和 fill=[1,6,9]我希望通过索引替换获得如下数组: x1_final=[1,2,3,4,5,NaN,7,8,NaN,10] 我编写了这行愚蠢的代码,它用fill数组的第一个元素替换所有NaN: for j in range(0,len(x1)): if np.isnan(x1[j]).a
x1=[NaN,2,3,4,5,NaN,7,8,NaN,10]
和
fill=[1,6,9]
我希望通过索引替换获得如下数组:
x1_final=[1,2,3,4,5,NaN,7,8,NaN,10]
我编写了这行愚蠢的代码,它用fill
数组的第一个元素替换所有NaN:
for j in range(0,len(x1)):
if np.isnan(x1[j]).any():
for i in range(0,len(fill)):
x1[j] = fill[i]
我怎样才能达到我的目标 这对你有用吗
train = np.array([2, 4, 4, 8, 32, np.NaN, 12, np.NaN])
fill = [1,3]
train[np.isnan(train)] = fill
print(train)
输出:
[ 2. 4. 4. 8. 32. 1. 12. 3.]
即使
fill
的大小与nan
s的数量不匹配,以下操作也应有效
>>> x1 = np.random.randint(0, 4, (10,))
>>> x1 = x1/x1 + x1
>>>
>>> x1
array([ 4., nan, nan, 4., nan, 3., nan, 2., 3., 4.])
>>>
>>> fill = np.arange(3)
>>>
>>> loc, = np.where(np.isnan(x1))
>>>
>>> x1[loc[:len(fill)]] = fill[:len(loc)]
>>>
>>> x1
array([ 4., 0., 1., 4., 2., 3., nan, 2., 3., 4.])
@chrisz的答案是正确的,因为你拥有numpy的力量,所以使用它:-) 但是,如果您仍然希望按照开始时的方式进行操作,则可以如下所示修复代码:
import numpy as np
x1 = [np.NaN, 2, 3, 4, 5, np.NaN, 7, 8, np.NaN, 10]
fill = [1, 6, 9]
i = 0
for j in range(0, len(x1)):
if np.isnan(x1[j]).any():
x1[j] = fill[i]
i += 1
print x1
您就快到了,您只需要正确计算填充的索引(可能会添加一些越界索引检查)
但是,正如我所说的,绝对要走numpy的路,它更快更干净。你能假设fill是正确的长度吗?是的,确实:)我已经事先创建了
fill
数组。