我想要定义没有初始化的长度,如下一个二维数组︰

Matrix = [][]

但它不起作用...

我试了下,该代码,但它是错的太︰

Matrix = [5][5]

错误︰

Traceback ...

IndexError: list index out of range

什么是我的错?

2011-07-12 15:54:38
问题评论:

一个没有定义阵列,或任何其他的事情。但是,可以创建多维序列,因为这里的答案显示。请记住,python变量是类型化的而强类型的

IMHO,这个问题是有效的。它涉及到特定代码,不能正常工作;答案会告诉我什么我需要知道,重要的是,混凝土,有关编程主题。请注意 upvotes,甚至喜爱的标记数。F.J 的答案即使介绍了一种方法可以完成初始化错误,以及为什么它是错的。所有非常有用。

回答:

从技术上讲,想要为未初始化数组。您必须先添加项,则之前初始化外部列表的列表Python 调用此"列表理解"。

# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5. 
Matrix = [[0 for x in range(w)] for y in range(h)] 

您现在可以向列表添加项︰

Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range... 
Matrix[0][6] = 3 # valid

print Matrix[0][0] # prints 1
x, y = 0, 6 
print Matrix[x][y] # prints 3; be careful with indexing! 

虽然您可以随意命名它们,我看这种方式以避免混乱,都有可能发生与索引,如果您使用"x"为其内部和外部列表,并希望非正方形矩阵。

[[在 range(cols_count) x 0] 中 range(rows_count) x]

通过 ademar111190 的奇数编辑。在 Python 3 没有任何 xrange 但如果一定要使用 Python 2 xrange 是不想不必要创建对象时要使用的函数。

如果不需要零填充它,可以使用range直接创建内部列表 @dave: [range(5) for x in range(5)]

@alanjds-也是如此,但仍可能有很多不必要的对象引用在中创建 Python 2 的外迭代 (用特大试验这一大范围)。另外,为某个值的初始化几乎始终是您所需的并且通常比不为 0。区域产生 iterable 集合-xrange 返回一台发电机。我点了,ademar"修复"已实际上更通常正确而且有效比他更正的内容。

如果您想让一个矩阵,可能是最好使用 numpy。

>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 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.]])
>>> numpy.matrix([[1, 2],[3, 4]])
matrix([[1, 2],
        [3, 4]])

(与拔下更为紧凑的输出) 的其他方法︰

>>> numpy.matrix('1 2; 3 4')
>>> numpy.arange(25).reshape((5, 5))
>>> numpy.array(range(25)).reshape((5, 5))
>>> numpy.ndarray((5, 5))

请注意,很多人建议不要使用matrix,因为array是更加灵活,但我认为我会包括它因为我们正在讨论矩阵。

只要您希望矩阵,想要使用 numpy。此答案应该是第一个。

对于数字矩阵,numpy 为王。我使用了二维数组的生成器,我选择嵌套的理解语法的用法。

没有需要的形状;您可以调用numpy.zeroes((5,5,...))来创建多维数组。

我同意该 numpy 是为 Python 中的矩阵方法。但有时 (例如家庭作业分配) 不只是能用它:(

下面是较短的表示法,用于初始化列表的列表︰

matrix = [[0]*5 for i in range(5)]

遗憾的这缩短为类似于5*[5*[0]]不会真正起作用,因为您将得到 5 份同一列表中,以便当您修改一个它们都更改,例如︰

>>> matrix = 5*[5*[0]]
>>> matrix
[[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]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]

缩短的危险有关的重要注释。

感谢您的缩短的警告。我的操作的错误。

您能解释"缩短"失败背后的逻辑?在这种情况下,为什么 python 输出列表副本的相同和不同的情况下的单元格的数组[0]*5?

这是因为 @mike622867 [0] * 5 Python 不能创建的值 0 (不是对象) 的引用,并且这将产生 [0.0.0.0.0]。这样如果假装有变量 x = [0,0,0,0,0],然后就可以引用 x 5 时间如果您还没有 [x * 5],因此现在如果更改 x 的所有引用,通过它传播和执行操作时所发生的情况 [[0] * 5] * 5

如果您想要创建一个空矩阵,正确的语法是

matrix = [[]]

如果您想要生成矩阵大小 5,用 0 填充

matrix = [[0 for i in xrange(5)] for i in xrange(5)]

如果只想为两维的容器来存放一些元素,您可以方便地改用字典︰

Matrix = {}

然后您可以的操作︰

Matrix[1,2] = 15
print Matrix[1,2]

这样做的原因是1,2是一个元组,并使用它作为键索引词典。结果是类似于一个哑的稀疏矩阵。

编辑︰通过 osa 和 Josap Valls 所示,您还可以使用Matrix = collections.defaultdict(lambda:0) ,以便将缺少的元素具有默认值为0.

Vatsal 进一步点,此方法可能不是很高效的大型矩阵,并只应在非性能关键代码部分中使用。

然后您可以执行import collections; Matrix = collections.defaultdict(float),以替换元素初始化为零。

访问键的 tuple(1,2) 的 dict 将不会有坏案例复杂度 o (n)。为内部它将哈希将元组。而使用二维数组可能使 o (1) 时间复杂度,可以访问 [1,2] 的索引访问。为此使用 dict 不应是不错的选择。

@Vatsal wiki.python.org/moin/TimeComplexity说,平均情况下是 o (1),但你最糟糕的情况几乎。无论如何,除非您正在谈论很多的项目您不关心这种差异。事实上,我会更担心内存比访问时间。

此外我们总是尽量避免使用 dicts 算法的总体复杂性之前等于或大于 O(n^2)。N 为 o (n) 访问的时间会产生 O(n^2) 复杂性。

@enobayram,对不起,但我不同意。最糟糕的案例 o (n) 访问时,asymptotic 分析从而提供 O(n^2),完成 n 次。其中 Amortized 为分析可以更低的绑定。并且没有分期和平均案例之间的巨大差异...任何假设和含糊不清的评论之前,请参阅

内容来源于Stack Overflow How to define two-dimensional array in python
请输入您的翻译

How to define two-dimensional array in python

确认取消