我有一个如下所示的列表:
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个元素。
有没有一种巧妙的方法可以做到这一点?
谢谢!
答案 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)
>>> 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]]