Lista list w tablicy numpy


183

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:


199

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)

15
Dzięki, przyjechałem tu po to. Od jakiegoś czasu używam numpy i uważam, że to zachowanie nie jest trywialne. Dziękujemy za poświęcenie czasu na wyjaśnienie tego bardziej ogólnego przypadku.
Adam Hughes

dtype=floatteż działa, zostanie przekonwertowane Nonena np.nan, co może być przydatne.

106
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
to automatycznie konwertuje listę listy w tablicy 2D, ponieważ długość wszystkich dołączonych list jest taka sama. Czy wiesz, jak tego nie robić: utwórz tablicę list, nawet jeśli wszystkie listy mają tę samą długość? Czy jest to możliwe, aby przekonwertować tablicę 2D na tablicę 1D tablicy 1D (to znaczy wydajnie, nie ma metody iteracyjnej ani map Pythona)
Juh_

7
Jeśli to nie działa, ponieważ Twoje listy podrzędne nie mają równych rozmiarów, zobacz następującą odpowiedź .
Nikana Reklawyks

@NikanaReklawyks Byłem zdezorientowany po spojrzeniu na odpowiedź, ale twój komentarz był pomocny. Dowiedziałem się, że moja lista list była postrzępiona, kiedy tak nie było.
Nikhil Girraj

39

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ę hstackpodejście ze względu na eleganckie użycie Numpy.


12
podczas gdy niektórzy ludzie mogą tego szukać, jestem prawie pewien, że OP chciał wielowymiarowego nparr.
Nathan

1
Szukałem tego :))
Pallie

26

To tak proste, jak:

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])

6

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

Zauważ, że jeśli masz już strukturę list zagnieżdżonych, nie potrzebujesz tej [...[...[...]]]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-1z jakiegoś powodu, inaczej stworzyłem dodatkową warstwę - trzeba to zbadać)
Venryx

Okay, problem w moim przypadku polega na tym, że dla najgłębszej „warstwy listy” listy nie miały tej samej długości, co spowodowało np.arraypo prostu „zawinięcie” tych najgłębszych list, a nie przekształcenie ich w tablice liczbowe.
Venryx

-2

Miałem listę równych długości. Nawet wtedy Ignacio Vazquez-Abramsodpowiedź 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)))

1
dlaczego, do cholery, miałbyś ciągle układać w stosy, jeśli wiesz, że masz 10 list, dlaczego nie np.empty ((10, 4)), a następnie po prostu go wypełniając?
Mehdi,

-4

Po prostu użyj pand

list(pd.DataFrame(listofstuff).melt().values)

działa to tylko w przypadku listy list

jeśli masz listę list, możesz spróbować czegoś podobnego do

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.