2010-01-31 5 views
6

Я знаю, что вы можете легко создавать вложенные списки в Python, как это:Как создать вложенные списки в python?

[[1,2],[3,4]] 

Но как создать 3x3x3 матрицу нулей?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)] 

или

[[[0]*3]*3]*3 

Не кажется правильным. Нет способа создать его, просто передавая список измерений методу? Пример:

CreateArray([3,3,3]) 

ответ

9

В случае на самом деле матрица - это то, что вы ищете, рассмотрите пакет numpy.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

Это даст вам 3x3x3 массив нулей:

numpy.zeros((3,3,3)) 

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

+0

Это не работает. Это должно быть numpy.zeros ((3, 3, 3)) –

+0

@ Cytokine исправлено –

+0

Хва, я клянусь, что кортеж был там, когда я набрал его ...Спасибо, Джейдер! –

-3

Просто гнездо синтаксис умножения:

[[[0] * 3] * 3] * 3 

Это поэтому просто выразить эту операцию с помощью folds

def zeros(dimensions): 
    return reduce(lambda x, d: [x] * d, [0] + dimensions) 

Или, если вы хотите, чтобы избежать ссылочный репликации, поэтому изменяя один вещь не повлияет ни на какие другие, вы должны использовать копии:

import copy 
def zeros(dimensions): 
    item = 0 
    for dimension in dimensions: 
     item = map(copy.copy, [item] * dimension) 
    return item 
+1

пожалуйста, позвольте мой редактировать –

+0

@Jader Dias: аминь – Dario

+0

сейчас, используя карту !! –

1

NumPy решает эту проблему

http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93

>>> a = array([2,3,4]) 
>>> a 
array([2, 3, 4]) 
>>> type(a) 
<type 'numpy.ndarray'> 

Но если вы хотите использовать собственные списки Python в качестве матрицы следующие вспомогательные методы могут стать под рукой:

import copy 

def Create(dimensions, item): 
    for dimension in dimensions: 
     item = map(copy.copy, [item] * dimension) 
    return item 
def Get(matrix, position): 
    for index in position: 
     matrix = matrix[index] 
    return matrix 
def Set(matrix, position, value): 
    for index in position[:-1]: 
     matrix = matrix[index] 
    matrix[position[-1]] = value 
1

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

На совершенно другом уровне: Вы думаете, что n-dimensional array NumPy может быть лучшим подходом?
Хотя вы можете использовать списки для реализации многомерных матриц, я думаю, что они не лучший инструмент для этой цели.

0

Или использовать функцию гнезда определенное here, в сочетании с повтором (0) от модуля itertools:

nest(itertools.repeat(0),[3,3,3]) 
Смежные вопросы