2010-09-03 6 views
6

J'ai une liste de nombres qui représentent la sortie aplatie d'une matrice ou d'un tableau produit par un autre programme, je connais les dimensions du tableau original et je veux lire les nombres dans soit une liste de listes ou une matrice NumPy. Il pourrait y avoir plus de 2 dimensions dans le tableau original.Lire la liste à plat dans un tableau multidimensionnel/matrice en python

par exemple.

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

produirait:

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

Des cris de joie à l'avance

Répondre

15

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

Vous pouvez également affecter directement au shape attrib ute de data si vous voulez éviter le copier dans la mémoire:

>>> data.shape = shape 
+0

Grand! Je n'arrive pas à croire que j'ai manqué de fouiller dans les documents NumPy. Merci – Chris

3

Si vous ne voulez pas utiliser numpy, il est un simple oneliner pour le cas 2d:

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

Et peut être généralisé multidimensions en ajoutant récursion:

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

Pour ces paquebots un là-bas:

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