将数据放入特别形状的列表中

时间:2013-11-26 21:00:52

标签: python numpy scipy

我有一个如下所示的列表:

my_list = [[20, 15, 10], [15, 22, 37, 46], [22, 91]]

所以它是二维的,但不是每一行都有相同数量的元素。

我现在有一个扁平的ndarray,如:

my_ndarray = np.array([9, 2, 4, 4, 1, 6, 7, 8, 17])

与my_list具有相同数量的元素。现在我想将my_ndarray塑造成与my_list相同,即:

my_ndarray = [[9, 2, 4], [4, 1, 6, 7], [8, 17]]

所以我们可以注意到,my_list和my_ndarray都包含3个子列表,第一个子列表包含3个元素,第二个子列表包含4个,第3个包含2个元素。

有没有一种巧妙的方法可以做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:8)

>>> it = iter([9, 2, 4, 4, 1, 6, 7, 8, 17])
>>> my_list = [[20, 15, 10], [15, 22, 37, 46], [22, 91]]
>>> [[next(it) for i in j] for j in my_list]
[[9, 2, 4], [4, 1, 6, 7], [8, 17]]

答案 1 :(得分:1)

使用numpy.array_split

>>> import numpy as np
>>> my_list = [[20, 15, 10], [15, 22, 37, 46], [22, 91]]
>>> my_ndarray = np.array([9, 2, 4, 4, 1, 6, 7, 8, 17])
>>> break_points = np.cumsum(map(len, my_list))
>>> break_points
array([3, 7, 9])

这将返回数组列表,在my_ndarray[0:3][3:7][7:9]切片[9:]

>>> np.array_split(my_ndarray, break_points)[:-1]
[array([9, 2, 4]), array([4, 1, 6, 7]), array([ 8, 17])]

获取列表清单:

>>> map(list, np.array_split(my_ndarray, break_points)[:-1])
[[9, 2, 4], [4, 1, 6, 7], [8, 17]]