¿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.
¿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:
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)
>>> numpy.array([[1, 2], [3, 4]])
array([[1, 2], [3, 4]])
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 hstack
enfoque por su elegante uso de Numpy.
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
[...[...[...]]]
parte. Solo necesitas llamar np.array
, con ndmin=number-of-list-layers
. (aunque en mi caso lo necesitaba ndmin=number-of-list-layers-minus-1
por alguna razón, de lo contrario, creé una capa adicional - necesito investigar)
np.array
"envolver" esas listas más profundas en lugar de convertirlas en matrices numpy.
Tenía una lista de listas de igual longitud. Incluso Ignacio Vazquez-Abrams
la 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)))