2010-09-03 42 views
6

Tôi có một danh sách các số đại diện cho đầu ra phẳng của một ma trận hoặc mảng được tạo bởi chương trình khác, tôi biết kích thước của mảng ban đầu và muốn đọc lại số hoặc danh sách các danh sách hoặc ma trận NumPy. Có thể có nhiều hơn 2 kích thước trong mảng ban đầu.Đọc danh sách phẳng thành mảng đa chiều/ma trận trong python

ví dụ:

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

Sẽ sản xuất:

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

Cheers trước

Trả lời

15

Sử dụng 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]]) 

Bạn cũng có thể gán trực tiếp cho số shape attrib ute của data nếu bạn muốn tránh sao chép nó trong bộ nhớ:

>>> data.shape = shape 
+0

Grand! Tôi không thể tin rằng tôi đã bỏ lỡ những thứ xung quanh tài liệu của NumPy. Cảm ơn – Chris

3

Nếu bạn không muốn sử dụng NumPy, có một oneliner đơn giản đối với trường hợp 2d:

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

Và có thể được khái quát hóa cho multidimensions bằng cách thêm đệ quy:

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

Đối với những ai lót ngoài kia:

>>> 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]]) 
Các vấn đề liên quan