2010-09-03 16 views
6

Mam listę liczb, które reprezentują spłaszczone wyjście macierzy lub macierzy wyprodukowanej przez inny program, znam wymiary oryginalnej tablicy i chcę odczytać liczby z powrotem do albo listę list lub matrycę NumPy. W oryginalnej tablicy może być więcej niż 2 wymiary.Odczytaj płaską listę w wielowymiarową tablicę/macierz w pytonie

np.

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

przyniosłoby:

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

Cheers wyprzedzeniem

Odpowiedz

15

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

Można również przypisać bezpośrednio do atrybutu shape ute z data jeśli chcesz uniknąć kopiując je w pamięci:

>>> data.shape = shape 
+0

Grand! Nie mogę uwierzyć, że tęskniłem za tym szturchaniem dokumentów NumPy. Dzięki – Chris

3

Jeśli nie chcesz korzystać z numpy, istnieje prosta oneliner dla 2d przypadku:

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

I można uogólnić dla multidimensions dodając rekursji:

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

dla tych, jednej wkładki tam:

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