我需要将列表转换为数组。但是asarray函数没有产生预期的结果,你知道如何进行转换吗?谢谢!
列表:
[[1,2],[4,5,6]]
转换为数组:
[[1,2,""],
[4,5,6]]
答案 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作为占位符。