用numpy.nan替换列表中的所有0

时间:2015-07-09 21:18:36

标签: python list

我有一个包含0的列表,我想将其更改为np.nan以进行计算。我试图做以下只替换第一个0:

l = [0,2,3,4,0]
l[l == 0] = np.nan
print l
[nan,2,3,4,0]

有没有办法对列表中的每个项目进行替换?

4 个答案:

答案 0 :(得分:5)

您可以使用内置地图:

l = map(lambda number: np.nan if number == 0 else number, l)

相当于:

for i in range(len(l)):
    l[i] = 0 if l[i] == np.nan else l[i]

答案 1 :(得分:3)

你不能使用numpy向量布尔索引或与Python列表进行比较,所以你的l == 0只是给你0.它只是一个侥幸它甚至部分工作,因为你碰巧有0作为第一个元件。

>>> l = [0,2,3,4,0]
>>> l == 0
False
>>> int(l == 0)
0
>>> l[l == 0] = 999
>>> l
[999, 2, 3, 4, 0]

你可以使用列表理解和三元:

>>> l = [0,2,3,4,0]
>>> l = [np.nan if x == 0 else x for x in l]
>>> l
[nan, 2, 3, 4, nan]

(如果你正在使用numpy数组,矢量比较和赋值工作,但是你不能很好地混合整数和浮点数(例如np.nan)。)

答案 2 :(得分:0)

这是一个很好的方式:

l = [x or np.nan for x in l]

答案 3 :(得分:0)

由于你已经在使用numpy:如果l是numpy.array而不是列表,那么你的符号是有效的。但是,只有当您的条目不是整数时,它才有效。浮:

array = np.array(list, dtype=float)
array[array == 0] = np.nan

现在数组看起来像这样:

array([ nan, 2.,  3., 4., nan])

如果你真的需要一个清单,那么

l = list(array)