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.

Richa Sachdev
źródło

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)
Bastiaan
źródło
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]])
Ignacio Vazquez-Abrams
źródło
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.

2cynykyl
źródło
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]])
Rik Poggi
źródło
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
opancerzony łoś
źródło
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)))
Nagabhushan SN
źródło
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)
Rishan
źródło