我面临基本替代问题。我有两个数组,其中一个包含数字和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]
我写过这段愚蠢的代码,用所有NaN代替fill
数组的第一个元素:
for j in range(0,len(x1)):
if np.isnan(x1[j]).any():
for i in range(0,len(fill)):
x1[j] = fill[i]
如何实现我的成绩?
答案 0 :(得分:3)
这对你有用吗?
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.]
答案 1 :(得分:1)
即使fill
的尺寸与nan
的数量
>>> 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.])
答案 2 :(得分:1)
@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
你几乎就在那里,你只需要正确计算填充的索引(可能会为一个越界索引添加一些检查)。
但是,正如我所说的那样,绝对是笨拙的,它更快更干净。