将包含None值的Python列表转换为包含nan值的NumPy数组

41
我试图将一个包含数字值和None值的列表转换为numpy.array,使得None被替换为numpy.nan
例如:
my_list = [3,5,6,None,6,None]

# My desired result: 
my_array = numpy.array([3,5,6,np.nan,6,np.nan]) 

朴素的方法失败了:

>>> my_list
[3, 5, 6, None, 6, None]
>>> np.array(my_list)
array([3, 5, 6, None, 6, None], dtype=object) # very limited 
>>> _ * 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

>>> my_array # normal array can handle these operations
array([  3.,   5.,   6.,  nan,   6.,  nan])
>>> my_array * 2
array([  6.,  10.,  12.,  nan,  12.,  nan])

什么是解决这个问题的最佳方法?

2个回答

58

你只需明确声明数据类型:

>>> my_list = [3, 5, 6, None, 6, None]
>>> np.array(my_list, dtype=np.float)
array([  3.,   5.,   6.,  nan,   6.,  nan])

我有一种感觉,似乎错过了某些简单的东西...谢谢。 - Akavall
4
这种方法的问题在于它只适用于定义了nan的浮点数,而不适用于int数据类型。 - Andrzej Pronobis
请查看我的问题,链接为https://dev59.com/zovda4cB1Zd3GeqPUAva,与该问题完全相关。 - Andrzej Pronobis
1
只是提醒一下,np.float 已经被弃用了。请使用 dtype=float 代替。 - undefined

7

关于什么?

my_array = np.array(map(lambda x: numpy.nan if x==None else x, my_list))

5
我会尽力进行翻译:我会说 x is None 比使用 == 更合适,因为后者可能存在一些小问题(参见这里)。 - alexey
对我有效的是 my_array = np.array(list(map(lambda x: np.nan if x is None else x, my_list))) - Esteban

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接