web-dev-qa-db-fra.com

Liste de listes dans un tableau numpy

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

145
Richa Sachdev

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

1) Faites 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) Tout d’abord, faites 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)
154
Bastiaan
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])
91

Comme il s’agit de la meilleure recherche sur Google pour convertir une liste de listes en un tableau Numpy, je proposerai ce qui suit malgré la question de 4 ans:

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

Quand j'ai d'abord pensé le faire de cette façon, j'étais assez content de moi parce que c'est tellement simple. Cependant, après avoir programmé une liste plus longue, il est plus rapide de procéder ainsi:

>>> 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, c'est pourquoi j'ai ajouté le concatenate.

Quoi qu'il en soit ... je préfère l'approche hstack pour son utilisation élégante de Numpy.

29
2cynykyl

C'est aussi simple que:

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

Encore une fois, après avoir cherché 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 comment je peux le contourner:

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
5
armoured-moose