二维零数组
python中没有数组类型,但是要模拟它,我们可以使用列表。我想用零填充二维数组状结构。我的问题是:这两个表达式有什么区别(如果有):
zeros = [[0 for i in xrange(M)] for j in xrange(M)]
和
zeros = [[0]*M]*N
会zeros
一样吗?通过速度和可读性更好地使用哪一个?
-
您应该使用
numpy.zeros
。如果不是这样,则需要第一个版本。在第二个版本中,如果您更改一个值,则它将在列表中的其他位置更改-例如:>>> a = [[0]*10]*10 >>> a [[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, 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], [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, 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]] >>> a[0][0] = 1 >>> a [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
这是因为(当您从内而外读取表达式时)创建了一个包含10个零的列表。然后,您创建一个包含10个引用的列表,该列表指向10个零的初始列表。
注意:
zeros = [ [0]*M for _ in range(N) ] # Use xrange if you're still stuck in the python2.x dark ages :).
也可以使用,并且避免了嵌套列表的理解。如果
numpy
不在桌子上,这就是我要使用的表格。