2010-09-03 14 views
6

Tengo una lista de números que representan la salida aplanada de una matriz o matriz producida por otro programa, conozco las dimensiones de la matriz original y quiero volver a leer los números ya sea una lista de listas o una matriz NumPy. Podría haber más de 2 dimensiones en la matriz original.Leer lista plana en matriz/matriz multidimensional en python

p. Ej.

data = [0, 2, 7, 6, 3, 1, 4, 5] 
shape = (2,4) 
print some_func(data, shape) 

produciría:

[[0,2,7,6], [3,1,4,5]]

Saludos de antelación

Respuesta

15

Uso numpy.reshape:

>>> import numpy as np 
>>> data = np.array([0, 2, 7, 6, 3, 1, 4, 5]) 
>>> shape = (2, 4) 
>>> data.reshape(shape) 
array([[0, 2, 7, 6], 
     [3, 1, 4, 5]]) 

también se pueden asignar directamente a la shape attrib UTE de data si se quiere evitar la copia en la memoria:

>>> data.shape = shape 
+0

¡Grand! No puedo creer que me haya perdido ese hurgar en los documentos de NumPy. Gracias – Chris

3

Si no desea utilizar numpy, hay una oneliner simple para el caso 2d:

group = lambda flat, size: [flat[i:i+size] for i in range(0,len(flat), size)] 

Y se puede generalizar para múltiples dimensiones mediante la adición de recursión:

import operator 
def shape(flat, dims): 
    subdims = dims[1:] 
    subsize = reduce(operator.mul, subdims, 1) 
    if dims[0]*subsize!=len(flat): 
     raise ValueError("Size does not match or invalid") 
    if not subdims: 
     return flat 
    return [shape(flat[i:i+subsize], subdims) for i in range(0,len(flat), subsize)] 
0

Para esos trazadores de líneas uno hacia fuera allí:

>>> data = [0, 2, 7, 6, 3, 1, 4, 5] 
>>> col = 4 # just grab the number of columns here 

>>> [data[i:i+col] for i in range(0, len(data), col)] 
[[0, 2, 7, 6],[3, 1, 4, 5]] 

>>> # for pretty print, use either np.array or np.asmatrix 
>>> np.array([data[i:i+col] for i in range(0, len(data), col)]) 
array([[0, 2, 7, 6], 
     [3, 1, 4, 5]]) 
Cuestiones relacionadas