如何使用另一个列表中的元素替换numpy数组中的NaN

问题描述 投票:-2回答:3

我面临一个基本替代的问题。我有两个数组,其中一个包含数字和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]).any():
        for i in range(0,len(fill)):
            x1[j] = fill[i]

我如何设法实现我的结果?

python python-3.x numpy
3个回答
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
投票

即使fill的大小与nans的数量不匹配,以下内容也应该有效

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

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

你几乎就在那里,你只需要正确计算填充的索引(可能为一个越界索引添加一些检查)。

但是,正如我所说,绝对是笨拙的,它更快更干净。

© www.soinside.com 2019 - 2024. All rights reserved.