2014-10-23 2 views
1

Там было несколько вопросов по SO о том, как инициализировать 2-мерную матрицу, с ответом быть что-то вроде этого:Инициализация п-мерной матрицы элегантно в Python

matrix = [[0 for x in range(10)] for x in range(10)] 

Есть ли способ обобщить это на n измерений без использования для блоков или выписать очень длинное вложенное понимание списка?

+2

Всякий раз, когда вы работаете с матрицами, вам следует рассмотреть возможность использования [NumPy] (http://www.numpy.org/). Он очень эффективен и предназначен для этой цели. – iCodez

+0

Возможный дубликат [Как получить пустой массив любого размера, который я хочу в python?] (Http://stackoverflow.com/questions/5205575/how-do-i-get-a-empty-array-of- any-size-i-want-in-python) –

+0

Я думаю, что это может быть канонический вопрос об инициализации матрицы, но в остальном это может быть дубликат. –

ответ

0

Как целые неизменны вы можете уменьшить ваш код:

matrix = [[0] * 10 for x in range(10)] 

Как @iCodez упоминается в комментариях, если NumPy является вариант, вы можете просто сделать:

import numpy as np            
matrix = np.zeros((10, 10)) 
0

Если вы действительно хотите матрицу , np.zeros и np.ones могут быстро создать такую ​​двумерную матрицу для создания матрицы:

import numpy as np 
my_matrix = np.matrix(np.zeros((10,10))) 

обобщить п измерений, вы не можете использовать матрицу, которая по определению является 2 мерная:

n_dimensions = 3 
width = 10 

n_dimensional_array = np.ones((width,) * n_dimensions) 
-1

Я согласен, что если NumPy вариант, это гораздо более простой способ работы с матрицами. Я очень рекомендую.

Это, как говорится, эта рекурсивная функция является разумным способом обобщения вашего кода на n измерений. Первым параметром является список или кортеж, определяющий, насколько велики должны быть каждое измерение (и, косвенно, сколько измерений). Второй параметр является постоянным значением, чтобы заполнить матрицу (в вашем примере, 0):

def init(sizes, value=0): 
    if (len(sizes) == 1): 
     return [value] * sizes[0] 
    else: 

     # old code - fixed per comment. This method does not create 
     # sizes[0] *new* lists, it just repeats the same list 
     # sizes[0] times. This causes unexpected behavior when you 
     # try to set an item in a list and all of its siblings get 
     # the same change 
     # return [init(sizes[1:], value)] * sizes[0] 

     # this method works better; it creates a new list each time through 
     return [init(sizes[1:], value) for i in xrange(sizes[0])] 

matrix = init((2,3,4), 5) 
matrix[0][0][0] = 100 # setting value per request in comment 
print matrix 
>>> [[[100, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]]] 

N-мерные массивы немного трудно напечатать на 2D экрана, но вы можете увидеть структуру matrix немного легче в фрагменте, ниже которого я вручную отступил. Это массив длиной 2, содержащий массивы длины 3, содержащий массивы длины 4, где каждое значение установлено на 5:

[ 
    [ 
     [100, 5, 5, 5], 
     [5, 5, 5, 5], 
     [5, 5, 5, 5] 
    ], 
    [ 
     [5, 5, 5, 5], 
     [5, 5, 5, 5], 
     [5, 5, 5, 5] 
    ] 
] 
+0

Как насчет выполнения 'matrix [0] [0] = 100', а затем печатать' matrix' после него? –

+0

@AshwiniChaudhary хороший улов, спасибо. Я изменил ваш фрагмент на 'matrix [0] [0] [0] = 100', так как это трехмерный массив (я предполагаю, что это вы имели в виду?). Теперь редактируется отредактированный код? –

-1

@ Брайан-Путман был быстрее и лучше ... в любом случае, это мой раствор:

init = lambda x, y: [init(x, y-1) if y>1 else 0 for _ in xrange(x)] 

, который генерирует только квадратные матрицы размера x, заполненные нулями в габаритных размерах. вызванный таким образом

init(5, 3) 

[[[0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0]], 
[[0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0]], 
[[0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0]], 
[[0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0]], 
[[0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0]]] 
Смежные вопросы