【问题标题】:Error while creating Identity matrix using list in python在 python 中使用列表创建标识矩阵时出错
【发布时间】:2022-01-09 09:38:11
【问题描述】:

我试图创建一个单位矩阵来找到逆矩阵。但是由于代码中的错误,我现在被困住了。新鲜的眼睛会有很大帮助。

identity=[]
null=[]
for i in range(3):
    null.append(i*0)
for j in range(3):
    identity.append(null)
for k in range(3):
    identity[k][k]=1

print(identity)

我得到的结果

[[1, 1, 1], [1, 1, 1], [1, 1, 1]]

我想要的

[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

【问题讨论】:

    标签: python list matrix linear-algebra matrix-multiplication


    【解决方案1】:

    您的代码的问题是 identity 没有 3 个不同的 null 列表,它有 3 个完全相同的 null 列表。这就是为什么在每次迭代中,你都会改变它们的值。

    例如,如果您只运行以下代码,您会发现不是最后一个 for 循环:

    identity[1][1]=1
    print(identity)
    

    你会发现结果是

    [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
    

    如果要使用列表创建单位矩阵,可以执行以下操作:在每次 ith 迭代中,追加一行 ith 元素为 1:

    identity = []
    for i in range(3):
        row = [0]*3
        row[i] = 1
        identity.append(row)
    

    作为一个函数:

    def eye(size):
        identity = []
        for i in range(size+1):
            row = [0]*(size+1)
            row[i] = 1
            identity.append(row)
        return identity
    
    eye(3)
    

    输出:

    [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    

    【讨论】:

    • 非常感谢您的解释和代码,它有帮助。但我从未见过 [0] *我的意思。我可以获得有关代码概念理解的任何文档吗?虽然它很明显 [0]*3 = [0,0,0] 我对它的内部机制一无所知。无论如何,谢谢。
    • @Charles 你可以阅读上面的 python 文档here
    【解决方案2】:
    identity = [[int(j == i) for j in range(n_rows)] for i in range(n_rows)]
    

    【讨论】:

      【解决方案3】:

      聚会迟到了,但是..

      关键是,当您运行第二个循环 (for j in range(3):) 时,您将附加三倍于名为 null 的对象。

      当您运行第三个循环for k in range(3): 时,您每次都在访问和修改同一个对象。

      您可以检查我的意思打印object id

      for k in range(3):
          print(id(identity[k]))
      

      解决办法就是追加一个copy of the object,把第二个循环改成:

      for j in range(3):
          identity.append(null.copy()) # <-- added .copy()
      

      【讨论】:

      • 感谢您的回复。很高兴得到您的支持。
      【解决方案4】:

      扩展@enke Answer,您可以以模块化形式进行,创建一个包含任意多行的单位矩阵。

      def eye(num):
          mat = []
          for i in range(num+1):
              row = [0]*(num+1)
              row[i]=1
              mat.append(row)
          return mat
      

      现在你可以轻松做到

      eye(5)
      
      Out[2]: 
      [[1, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1]]
      

      【讨论】:

      • 谢谢,但代码中方括号零的含义是什么。你能制定一个更简单的代码吗?菜鸟可以遵循的东西。
      • 在 Python 中,[0]*3 将等于 [0,0,0][0]*4 将等于 [0,0,0,0],因此我们创建了一个全为零的行。然后将该行中当前行索引的值更改为 1。所以如果是第 3 行,它会将第 3 个值更改为 1,其余为 0。
      【解决方案5】:

      您可以使用 Numpy 库轻松创建

      import numpy as np 
      data = np.eye(rows, columns) 
      [![# Let's do that: 
      data = np.eye(5,5) 
      print(data)][1]][1]
      

      希望你能理解! [1]:https://i.stack.imgur.com/wmKpe.png

      【讨论】:

      • 谢谢你,但是你能给出一个没有numpy的解决方案吗?我再次编辑了代码。
      • 它麻木的眼睛不是眼睛
      • 是的,很抱歉
      【解决方案6】:

      a = int(input('输入你需要的矩阵个数::'))

      lis = []
      
      
      for i in range(a):
          new = [0]*a
          new[i] = 1
          lis.append(new)
      
      # Now you can add many identity matrix, Enjoy!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 2016-07-29
        • 2016-11-16
        • 2016-05-27
        • 1970-01-01
        相关资源
        最近更新 更多