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.

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)

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]])

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.


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]])

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

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)))

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.