我正在使用列表列表来存储python中的矩阵。我尝试按如下方式初始化2x3 Zero矩阵。
mat=[[0]*2]*3
但是,当我更改矩阵中某个项的值时,它会更改每个行中该条目的值,因为mat
中每行的id是相同。例如,在分配
mat[0][0]=1
mat
是[[1, 0], [1, 0], [1, 0]]
。
我知道我可以使用循环创建Zero矩阵,如下所示,
mat=[[0]*2]
for i in range(1,3):
mat.append([0]*2)
但有人能告诉我更多的pythonic方式吗?
答案 0 :(得分:9)
>>> mat = [[0]*2 for x in xrange(3)]
>>> mat[0][0] = 1
>>> mat
[[1, 0], [0, 0], [0, 0]]
或者,作为一个功能:
def matrix(rows, cols):
return [[0]*cols for x in xrange(rows)]
答案 1 :(得分:8)
试试这个:
>>> cols = 6
>>> rows = 3
>>> a = [[0]*cols for _ in [0]*rows]
>>> a
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
>>> a[0][3] = 2
>>> a
[[0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
还讨论了in this answer:
>>> lst_2d = [[0] * 3 for i in xrange(3)]
>>> lst_2d
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> lst_2d[0][0] = 5
>>> lst_2d
[[5, 0, 0], [0, 0, 0], [0, 0, 0]]
答案 2 :(得分:6)
这个比接受的答案快!
使用xrange(行)而不是[0] *行没有区别。
>>> from itertools import repeat
>>> rows,cols = 3,6
>>> a=[x[:] for x in repeat([0]*cols,rows)]
不使用itertools并以相同速度运行的变体
>>> a=[x[:] for x in [[0]*cols]*rows]
来自ipython:
In [1]: from itertools import repeat
In [2]: rows=cols=10
In [3]: timeit a = [[0]*cols for _ in [0]*rows]
10000 loops, best of 3: 17.8 us per loop
In [4]: timeit a=[x[:] for x in repeat([0]*cols,rows)]
100000 loops, best of 3: 12.7 us per loop
In [5]: rows=cols=100
In [6]: timeit a = [[0]*cols for _ in [0]*rows]
1000 loops, best of 3: 368 us per loop
In [7]: timeit a=[x[:] for x in repeat([0]*cols,rows)]
1000 loops, best of 3: 311 us per loop
答案 3 :(得分:4)
我用
mat = [[0 for col in range(3)] for row in range(2)]
虽然取决于您在创建矩阵后对矩阵所做的操作,但您可以查看使用NumPy数组。
答案 4 :(得分:3)
这将有效
col = 2
row = 3
[[0] * col for row in xrange(row)]
答案 5 :(得分:2)
怎么样:
m, n = 2, 3
>>> A = [[0]*m for _ in range(n)]
>>> A
[[0, 0], [0, 0], [0, 0]]
>>> A[0][0] = 1
[[1, 0], [0, 0], [0, 0]]
Aka List理解;来自docs:
List comprehensions provide a concise way to create lists
without resorting to use of
map(), filter() and/or lambda.
The resulting list definition tends often to be clearer
than lists built using those constructs.
答案 6 :(得分:2)
如果涉及的尺寸实际上只有2和3,
mat = [[0, 0], [0, 0], [0, 0]]
是最好的,还没有被提及。
答案 7 :(得分:1)
另见this question对n级嵌套列表/ n维矩阵的推广。
答案 8 :(得分:1)
有什么itertools不能做的吗? :)
>>> from itertools import repeat,izip
>>> rows=3
>>> cols=6
>>> A=map(list,izip(*[repeat(0,rows*cols)]*cols))
>>> A
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
>>> A[0][3] = 2
>>> A
[[0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]