5

我知道你可以像这样在 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])
4

5 回答 5

9

如果矩阵实际上是您正在寻找的,请考虑使用 numpy 包。

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

这将为您提供一个 3x3x3 的零数组:

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

您还可以从为科学计算构建的模块的便利功能中受益。

于 2010-01-31T20:06:55.407 回答
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
于 2010-01-31T20:06:51.693 回答
1

列表推导式只是为列表初始化增加表现力的语法糖;在您的情况下,我根本不会使用它们,而是使用简单的嵌套循环。

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

于 2010-01-31T20:07:43.800 回答
0

或者使用这里定义的嵌套函数,结合 itertools 模块中的 repeat(0) :

nest(itertools.repeat(0),[3,3,3])
于 2010-02-23T20:11:01.823 回答
-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
于 2010-01-31T20:01:31.550 回答