2010-01-31 99 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)) – 2010-01-31 20:13:18

+0

@ Cytokine更正 – 2010-01-31 20:19:02

+0

哈,我发誓当我输入它时,元组在那里......谢谢Jader! – 2010-01-31 20:30:26

-3

就窝乘法语法:

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

这是因此简单的表达使用​​

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

请允许我编辑 – 2010-01-31 20:17:38

+0

@Jader迪亚斯:阿门 – Dario 2010-01-31 20:33:27

+0

现在使用的地图! – 2010-01-31 20:39:44

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

列表解析只是用于增加表达式对列表初始化的语法糖;在你的情况下,我根本不会使用它们,并进行一个简单的嵌套循环。

完全不同的水平:你认为NumPy的n-dimensional array可能是一个更好的方法?
尽管您可以使用列表来实现多维矩阵,但我认为它们并不是实现该目标的最佳工具。

0

或者使用定义here巢功能,从itertools模块里重复(0)合并:

nest(itertools.repeat(0),[3,3,3])