【问题标题】:Trying to construct identity matrix? [duplicate]试图构造单位矩阵? [复制]
【发布时间】:2017-03-09 06:13:25
【问题描述】:

写一个函数 identity(n) 返回第 n 个身份 矩阵。
例如:identity(3) 输出 [[1,0,0][0,1,0][0,0,1]]
我试过如下:

def identity(n):
matrix=[[0]*n]*n
i=0
while i<n:
    matrix[i][i]=1
    i+=1
return matrix

我也尝试了范围,但它没有像这样工作

def identity(n):
    matrix=[[0]*n]*n
    k=matrix[:]
    i=0
    for i in range(1,n):
        matrix[i][i]=1
        i+=1
    return k
print(identity(5))

但它为n = 5 输出:

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

【问题讨论】:

    标签: python arrays algorithm list matrix


    【解决方案1】:

    Numpy 内置了这个,你可以使用 np.eye(n):

    In [1]: import numpy as np
    
    In [2]: x = np.eye(4)
    
    In [3]: x
    Out[3]:
    array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])
    

    【讨论】:

      【解决方案2】:

      如果不允许使用 numpy ... 知道这个How to define two-dimensional array in python

      然后这样做

      def identity(n):
          m=[[0 for x in range(n)] for y in range(n)]
          for i in range(0,n):
              m[i][i] = 1
          return m
      

      【讨论】:

      • Oneliner:identity = [[0]*i + [1] + [0]*(n-i-1) for i in range(n) ]
      • 太晚了,但我一直认为这太长了,于是想出了:m=[[int(x==y) for x in range(n)] for y in range(n)]
      【解决方案3】:

      这是因为您初始化matrix 的方式。 [[0]*n]*n 的每个子列表[0]*n 相同,换句话说,矩阵的每一行都是对同一底层行的引用。您可以使用id 验证这一点:

      > x = [[0]*3]*3
      > x
      [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
      > id(x[0])
      140017690403112
      > id(x[1])
      140017690403112
      > id(x[2])
      140017690403112
      

      T因此,当您将值分配给矩阵的第 ith 行时,您将其分配给所有行。所以避免使用[0]*n 创建嵌套列表。相反,使用

      matrix = [[0]*n for _ in range(n)]
      

      更简单,避免所有这些:

      import numpy as np
      np.eye(n)
      

      【讨论】:

        猜你喜欢
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多