Python 替换所有0';s在与numpy.nan的列表中

Python 替换所有0';s在与numpy.nan的列表中,python,list,Python,List,我有一个包含0的列表,我想将其更改为np.nan,以便在进行计算时使用。我正在尝试执行以下仅替换前0的操作: l = [0,2,3,4,0] l[l == 0] = np.nan print l [nan,2,3,4,0] 是否有办法对列表中的每个项目进行替换?您可以使用内置映射: l = map(lambda number: np.nan if number == 0 else number, l) 这相当于: for i in range(len(l)): l[i] = 0 if

我有一个包含0的列表,我想将其更改为np.nan,以便在进行计算时使用。我正在尝试执行以下仅替换前0的操作:

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

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

您可以使用内置映射:

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]

您不能使用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)混合得太好。)

这里有一个很好的方法:

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

因为您已经在使用numpy:如果
l
是一个numpy.array而不是一个列表,那么您的符号是有效的。但是,仅当您的条目不是整数时,它才起作用,例如浮点数:

array = np.array(list, dtype=float)
array[array == 0] = np.nan
现在,数组如下所示:

array([ nan, 2.,  3., 4., nan])
如果你真的需要一份清单,那么

l = list(array)