Mam listę, która wygląda tak:

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

Jest więc dwa wymiarowe, ale nie każda linia ma taką samą liczbę elementów.

Mam teraz płaską ndarray, jak:

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

Które mają taką samą ilość elementów z My_list. Teraz chciałbym ukształtować mój_ndarray, aby był taki sam z My_list, I.E.:

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

Możemy więc zauważyć, że zarówno my_list, jak i My_ndarray zawierają 3 subblistów, a 1st Subsist zawiera 3 elementy, 2nd Subsists ma 4, a 3Rd ma w nim 2 elementy.

Czy jest na to zgrabny sposób?

Dzięki!

2
Yuxiang Wang 27 listopad 2013, 01:00

2 odpowiedzi

Najlepsza odpowiedź
>>> 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]]
8
John La Rooy 26 listopad 2013, 21:08

Korzystanie z 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])

To zwraca listę tablic, krojenie my_ndarray przy [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])]

Aby uzyskać listę list:

>>> map(list, np.array_split(my_ndarray, break_points)[:-1])
[[9, 2, 4], [4, 1, 6, 7], [8, 17]]
1
Ashwini Chaudhary 26 listopad 2013, 21:42