列表到一行python中具有不同列的数组

时间:2014-03-01 22:43:54

标签: python arrays list numpy

我需要将列表转换为数组。但是asarray函数没有产生预期的结果,你知道如何进行转换吗?谢谢!

列表:

[[1,2],[4,5,6]]

转换为数组:

[[1,2,""],
[4,5,6]] 

2 个答案:

答案 0 :(得分:3)

所需的NumPy数组必须是dtype object。这种阵列不具备NumPy阵列与原生dtypes的速度优势。您可能需要重新调整目标。

然而,更多的是游戏精神而非实用性,以下是可以创建所需数组的方式:

In [50]: import itertools as IT

In [51]: seq = [[1,2],[4,5,6]]

In [52]: np.array(zip(*(IT.izip_longest(*seq, fillvalue=''))), dtype='O')
Out[52]: 
array([[1, 2, ''],
       [4, 5, 6]], dtype=object)

(感谢@ m.wasowski,zip代替list(IT.izip(...))改进。)

@ utdemir将-1用作占位符的想法允许你创建一个本地int dtype的numpy数组。使用上面的代码,您需要更改的是fillvalue-1

In [56]: np.array(zip(*(IT.izip_longest(*seq, fillvalue=-1))))
Out[56]: 
array([[ 1,  2, -1],
       [ 4,  5,  6]])

另一种选择是使用NumPy masked array

In [68]: np.ma.masked_less(zip(*(IT.izip_longest(*seq, fillvalue=-1))), 0)
Out[68]: 
masked_array(data =
 [[1 2 --]
 [4 5 6]],
             mask =
 [[False False  True]
 [False False False]],
       fill_value = 999999)

屏蔽数组允许您在正确处理缺失数据的同时执行NumPy计算。例如,可以通过以下方式找到列的平均值:

In [71]: print(arr.mean(axis=0))
[2.5 3.5 6.0]

请注意,最后一列的平均值为6,而不是3。

答案 1 :(得分:0)

好吧,看起来你应该手动做。

>>> s = [[1,2], [4,5,6]]
>>> maxl = max(map(len, s))
>>> np.asarray([i + [-1]*(maxl-len(i)) for i in s])
array([[ 1,  2, -1],
       [ 4,  5,  6]])

但numpy的数组是同质的,所以你不能在数组中同时包含字符串和int;所以我用-1作为占位符。