我知道你可以像这样在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])
如果矩阵确实是您正在寻找的,请考虑 numpy 包。
http://docs.scipy.org/doc/numpy/reference/ generated/numpy.zeros.html#numpy.zeros
这将为您提供一个 3x3x3 的零数组:
numpy.zeros((3,3,3))
您还可以受益于为科学计算而构建的模块的便利功能。
列表推导式只是为列表初始化添加表达力的语法糖;在你的情况下,我根本不会使用它们,而是选择一个简单的嵌套循环。
在完全不同的层面上:您认为 NumPy 的 n 维数组可能是更好的方法吗?
虽然您可以使用列表来实现多维矩阵,但我认为它们不是实现该目标的最佳工具。
NumPy 解决了这个问题
>>> 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
或者使用here定义的嵌套函数,结合itertools模块中的repeat(0):
nest(itertools.repeat(0),[3,3,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