2010-09-03 13 views
6

Ho una lista di numeri che rappresentano l'output appiattito di una matrice o matrice prodotta da un altro programma, conosco le dimensioni della matrice originale e voglio leggere i numeri di nuovo in una lista di liste o una matrice NumPy. Ci potrebbero essere più di 2 dimensioni nell'array originale.Leggere la lista piatta in matrice/matrice multidimensionale in python

ad es.

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

produrrebbe:

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

Acclamazioni di anticipo

risposta

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

È inoltre possibile assegnare direttamente al shape attrib ute di data se si vuole evitare la copia in memoria:

>>> data.shape = shape 
+0

Grand! Non riesco a credere che mi sia sfuggito che spuntavo tra i documenti di NumPy. Grazie – Chris

3

Se non volete usare NumPy, c'è una semplice oneliner per il caso 2d:

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

E può essere generalizzato per universo multi di ricorsione aggiungendo:

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

per coloro uno liners là fuori:

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