Jak przekonwertować prostą listę list na tablicę numpy? Wiersze są pojedynczymi listami podrzędnymi, a każdy wiersz zawiera elementy na liście podrzędnej.
Jak przekonwertować prostą listę list na tablicę numpy? Wiersze są pojedynczymi listami podrzędnymi, a każdy wiersz zawiera elementy na liście podrzędnej.
Odpowiedzi:
Jeśli twoja lista list zawiera listy z różną liczbą elementów, odpowiedź Ignacio Vazquez-Abramsa nie zadziała. Zamiast tego istnieją co najmniej 3 opcje:
1) Stwórz tablicę tablic:
x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>
2) Utwórz tablicę list:
x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>
3) Najpierw wyrównaj długość list:
x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>> [1, 2, 3],
>>> [1, None, None]], dtype=object)
>>> numpy.array([[1, 2], [3, 4]])
array([[1, 2], [3, 4]])
Ponieważ jest to najczęściej wyszukiwane w Google narzędzie do konwersji listy list do tablicy Numpy, zaoferuję następujące informacje, mimo że pytanie ma 4 lata:
>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]
Kiedy po raz pierwszy pomyślałem o zrobieniu tego w ten sposób, byłem całkiem zadowolony z siebie, ponieważ jest to takie proste. Jednak po zsynchronizowaniu go z większą listą, jest to w rzeczywistości szybsze:
>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]
Zauważ, że odpowiedź nr 1 Bastiaana nr 1 nie tworzy żadnej ciągłej listy, dlatego dodałem concatenate
.
W każdym razie ... Wolę hstack
podejście ze względu na eleganckie użycie Numpy.
Znów, po wyszukaniu problemu konwersji zagnieżdżonych list z poziomami N w tablicę N-wymiarową nic nie znalazłem, więc oto moja droga:
import numpy as np
new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3
[...[...[...]]]
części. Musisz tylko zadzwonić np.array
, z ndmin=number-of-list-layers
. (chociaż w moim przypadku potrzebowałem ndmin=number-of-list-layers-minus-1
z jakiegoś powodu, inaczej stworzyłem dodatkową warstwę - trzeba to zbadać)
np.array
po prostu „zawinięcie” tych najgłębszych list, a nie przekształcenie ich w tablice liczbowe.
Miałem listę równych długości. Nawet wtedy Ignacio Vazquez-Abrams
odpowiedź mi nie wyszła. Mam tablicę liczb 1-D, której elementami są listy. Jeśli napotkałeś ten sam problem, możesz użyć poniższej metody
Posługiwać się numpy.vstack
import numpy as np
np_array = np.empty((0,4), dtype='float')
for i in range(10)
row_data = ... # get row_data as list
np_array = np.vstack((np_array, np.array(row_data)))