Считать плоский список в многомерный массив / матрицу в Python - PullRequest
7 голосов
/ 03 сентября 2010

У меня есть список чисел, представляющих сплющенный вывод матрицы или массива, созданного другой программой, я знаю размеры исходного массива и хочу прочитать числа обратно либо в список списков, либо в матрицу NumPy.В исходном массиве может быть более двух измерений.

Например,

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

Будет выдано:

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

Приветствия заранее

Ответы [ 3 ]

20 голосов
/ 03 сентября 2010

Использование 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]])

Вы также можете напрямую присвоить атрибуту shape data, если хотите избежать его копирования в памяти:

>>> data.shape = shape
5 голосов
/ 20 декабря 2013

Если вы не хотите использовать numpy, для двумерного случая есть простой oneliner:

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

. И может быть обобщен для многомерности путем добавления рекурсии:

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 голосов
/ 22 января 2018

Для тех лайнеров:

>>> 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...