我有一个矩阵式数组,(假设)看起来像这样:
mat = [[0,2,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
imat = mat
for i in xrange(4):
for j in xrange(4):
imat[j][i] = mat[i][j]
for i in xrange(4):
for j in xrange(4):
imat[j][i] = mat[i][j]
代码基本上将行/列从“mat”切换为“imat”。
结果:
mat:
[[0, 2, 0, 0], [2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
imat:
[[0, 2, 0, 0], [2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
谁能告诉我为什么数组项目像这样重复?
此外,如果有更有效的方法来执行此操作,那也将受到赞赏。
答案 0 :(得分:1)
问题出在这一行:
imat = mat
相反,你应该这样做,在开头分配一个新的4x4矩阵:
imat = [[0]*4 for _ in xrange(4)]
发生的事情是您没有正确初始化imat
,您只分配了对mat
的引用,因此两个对象都是同一个,因此不会进行任何修改。另外,转换矩阵的更简单的替代方法是:
imat = [list(m) for m in zip(*mat)]
答案 1 :(得分:1)
此外,如果有更有效的方法来执行此操作,那也将受到赞赏。
是的,它被称为矩阵transpose操作,在Python中使用内置函数zip()
和*-unpacking完成:
imat = zip(*mat)
至于为什么你当前的代码不起作用,@ÓscarLópez做对了,imat = mat
没有创建矩阵的新副本。