Liste des listes dans un tableau numpy

194

Comment convertir une simple liste de listes en un tableau numpy? Les lignes sont des sous-listes individuelles et chaque ligne contient les éléments de la sous-liste.

Richa Sachdev
la source

Réponses:

208

Si votre liste de listes contient des listes avec un nombre variable d'éléments, la réponse d'Ignacio Vazquez-Abrams ne fonctionnera pas. Au lieu de cela, il y a au moins 3 options:

1) Créez un tableau de tableaux:

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) Faites un tableau de listes:

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>

3) Faites d'abord les listes de longueur égale:

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
la source
16
Merci, je suis venu ici pour ça. J'utilise numpy depuis un certain temps et j'ai trouvé ce comportement non trivial. Merci d'avoir pris le temps d'expliquer ce cas plus général.
Adam Hughes
1
dtype=floatfonctionne aussi, il sera converti Noneen np.nan, ce qui peut être utile.
115
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])
Ignacio Vazquez-Abrams
la source
14
cela convertit automatiquement une liste de liste dans un tableau 2D car la longueur de toutes les listes incluses est la même. Savez-vous comment ne pas faire ça: faire un tableau de liste même si toutes les listes ont la même longueur? Ou est-il possible de convertir un tableau 2D en un tableau 1D de tableau 1D (efficacement je veux dire, pas de méthode itérative ou de carte python)
Juh_
7
Si cela ne fonctionne pas pour vous parce que vos sous-listes ne sont pas de tailles égales, consultez la réponse suivante .
Nikana Reklawyks
@NikanaReklawyks J'étais confus après avoir regardé la réponse mais votre commentaire était utile. J'ai découvert que ma liste de listes était irrégulière, alors qu'elle n'était pas censée l'être.
Nikhil Girraj
À quelle vitesse est-ce par rapport à la longueur de l'argument? Je ne vois pas de bonne réponse dans la documentation?
Czarking
39

Comme il s'agit de la principale recherche sur Google pour convertir une liste de listes en un tableau Numpy, je vais vous proposer ce qui suit bien que la question ait 4 ans:

>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]

Quand j'ai pensé à le faire de cette façon pour la première fois, j'étais assez content de moi car c'est tellement simple. Cependant, après avoir chronométré avec une plus grande liste de listes, il est en fait plus rapide de le faire:

>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]

Notez que la réponse n ° 1 de @ Bastiaan ne fait pas une seule liste continue, j'ai donc ajouté le fichier concatenate.

Quoi qu'il en soit ... Je préfère l' hstackapproche pour son utilisation élégante de Numpy.

2cynykyle
la source
13
alors que certaines personnes recherchent peut-être cela, je suis presque sûr que l'OP voulait un nparr multidimensionnel.
Nathan
2
Je cherchais ceci :))
Pallie
26

C'est aussi simple que:

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])
Rik Poggi
la source
7

Encore une fois, après avoir recherché le problème de la conversion de listes imbriquées avec N niveaux en un tableau à N dimensions, je n'ai rien trouvé, alors voici mon chemin:

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
orignal blindé
la source
Notez que si vous avez déjà la structure des listes imbriquées, vous n'avez pas besoin de la [...[...[...]]]pièce. Vous avez juste besoin d'appeler np.array, avec ndmin=number-of-list-layers. (bien que dans mon cas j'en avais besoin ndmin=number-of-list-layers-minus-1pour une raison quelconque, sinon j'ai créé une couche supplémentaire - besoin d'enquêter)
Venryx
Ah d'accord, le problème dans mon cas est que pour la "couche de liste" la plus profonde, les listes n'avaient pas toutes la même longueur, ce qui provoquait np.arraysimplement "envelopper" ces listes les plus profondes plutôt que de les convertir en tableaux numpy.
Venryx
-4

J'avais une liste de listes de longueur égale. Même alors, Ignacio Vazquez-Abramsla réponse n'a pas fonctionné pour moi. J'ai un tableau numpy 1-D dont les éléments sont des listes. Si vous rencontrez le même problème, vous pouvez utiliser la méthode ci-dessous

Utilisation 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
la source
2
pourquoi diable continueriez-vous à empiler si vous savez que vous avez 10 listes, pourquoi pas np.empty ((10, 4)) et ensuite simplement le remplir?
Mehdi
-5

Utilisez juste des pandas

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

cela ne fonctionne que pour une liste de listes

si vous avez une liste de listes, vous voudrez peut-être essayer quelque chose du genre

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Rishan
la source