【问题标题】:Python Array Cleanup Issues [duplicate]Python数组清理问题[重复]
【发布时间】:2014-05-10 22:17:21
【问题描述】:

我有一个矩阵样式的数组,它(假设)看起来像这样:

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]]

谁能告诉我为什么数组项会这样重复?
此外,如果有更有效的方法来执行此操作,那也将不胜感激。

【问题讨论】:

  • imatmat 都指向同一个对象。
  • imat = map(list, zip(*mat)) 是 IMO 最干净的方式。

标签: python arrays variables


【解决方案1】:

问题出在这一行:

imat = mat

您应该这样做,在开头分配一个新的 4x4 矩阵:

imat = [[0]*4 for _ in xrange(4)]

发生的情况是您没有正确初始化 imat,您只分配了对 mat 的引用,因此两个对象是相同的,因此没有执行任何修改。此外,转置矩阵的更简单的替代方法是:

imat = [list(m) for m in zip(*mat)]

【讨论】:

  • 路过的选民:想发表评论吗?我的回答有什么问题?
  • 奇怪。我看不出有什么问题。是否有第一个质量较低的版本,被 5 分钟的编辑窗口隐藏?
  • @user2357112 不,我从一开始就发布了imat = [[0]*4 for _ in xrange(4)] 部分,但后来扩展了解释
  • @user2357112 是的,原来是“试试这个”的答案,没有任何解释。
  • 谢谢。 imat = [[0]*4... 工作得非常好。你找到了问题所在。它现在可以工作了。
【解决方案2】:

另外,如果有更有效的方法来执行此操作,那也将不胜感激。

是的,它被称为矩阵transpose 操作,在 Python 中是使用内置函数 zip()*-unpacking 完成的:

imat = zip(*mat)

至于为什么您当前的代码不起作用,@Óscar López 是对的,执行 imat = mat 不会创建矩阵的新副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2021-11-02
    • 2013-02-02
    相关资源
    最近更新 更多