Lista de listas en una matriz numpy

183

¿Cómo convierto una lista simple de listas en una matriz numpy? Las filas son sublistas individuales y cada fila contiene los elementos en la sublista.

Richa Sachdev
fuente

Respuestas:

199

Si su lista de listas contiene listas con un número variable de elementos, entonces la respuesta de Ignacio Vázquez-Abrams no funcionará. En cambio, hay al menos 3 opciones:

1) Hacer una matriz de matrices:

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) Haz una serie de listas:

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

3) Primero haga que las listas tengan la misma longitud:

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
fuente
15
Gracias, vine aquí por esto. He estado usando numpy durante un tiempo y descubrí que este comportamiento no es trivial. Gracias por tomarse el tiempo para explicar este caso más general.
Adam Hughes
dtype=floattambién funciona, se convertirá Nonea np.nan, lo que puede ser útil.
108
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])
Ignacio Vazquez-Abrams
fuente
13
esto convierte automáticamente una lista de listas en una matriz 2D porque la longitud de todas las listas incluidas es la misma. ¿Sabes cómo no hacer eso: hacer una matriz de lista incluso si todas las listas tienen la misma longitud? ¿O es posible convertir una matriz 2D en una matriz 1D de una matriz 1D (eficientemente quiero decir, sin método iterativo o material de mapa de Python)
Juh_
77
Si eso no funciona para usted porque sus sublistas no son de tamaños pares, consulte la siguiente respuesta .
Nikana Reklawyks
@NikanaReklawyks Estaba confundido después de mirar la respuesta, pero tu comentario fue útil. Descubrí que mi lista de listas era irregular, cuando no se suponía que lo fuera.
Nikhil Girraj
39

Como esta es la búsqueda principal en Google para convertir una lista de listas en una matriz Numpy, ofreceré lo siguiente a pesar de que la pregunta tiene 4 años:

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

Cuando pensé por primera vez en hacerlo de esta manera, me quedé bastante satisfecho porque es muy simple. Sin embargo, después de cronometrarlo con una lista más grande de listas, en realidad es más rápido hacer esto:

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

Tenga en cuenta que la respuesta # 1 de @ Bastiaan no hace una sola lista continua, por lo tanto, agregué el concatenate.

De todos modos ... prefiero el hstackenfoque por su elegante uso de Numpy.

2cynykyl
fuente
12
Si bien algunas personas pueden estar buscando esto, estoy bastante seguro de que el OP quería un nparr multidimensional.
Nathan
1
Estaba buscando esto :))
Pallie
26

Es tan simple como:

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

Nuevamente, después de buscar el problema de convertir listas anidadas con N niveles en una matriz N-dimensional, no encontré nada, así que he aquí mi solución:

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
alces blindados
fuente
Tenga en cuenta que si ya tiene la estructura de listas anidadas, no necesita la [...[...[...]]]parte. Solo necesitas llamar np.array, con ndmin=number-of-list-layers. (aunque en mi caso lo necesitaba ndmin=number-of-list-layers-minus-1por alguna razón, de lo contrario, creé una capa adicional - necesito investigar)
Venryx
Ah, está bien, el problema en mi caso es que para la "capa de lista" más profunda, las listas no tenían la misma longitud, lo que causaba np.array"envolver" esas listas más profundas en lugar de convertirlas en matrices numpy.
Venryx
-2

Tenía una lista de listas de igual longitud. Incluso Ignacio Vazquez-Abramsla respuesta de entonces no funcionó para mí. Tengo una matriz numpy 1-D cuyos elementos son listas. Si enfrentó el mismo problema, puede usar el siguiente método

Utilizar 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
fuente
1
¿Por qué demonios seguiría apilando si sabe que tiene 10 listas, por qué no np.empty ((10, 4)) y luego simplemente llenarlo?
Mehdi
-4

Solo usa pandas

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

esto solo funciona para una lista de listas

si tiene una lista de listas de listas, puede probar algo similar a

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