【问题标题】:Determine whether a matrix is identity matrix (numpy)判断一个矩阵是否为单位矩阵(numpy)
【发布时间】:2018-01-11 06:50:53
【问题描述】:

确定给定矩阵“M”是否为 等于身份? IE。类似:

if numpy.identity(3) == M:
     ...

【问题讨论】:

    标签: python arrays numpy matrix numpy-ndarray


    【解决方案1】:

    np.eyenp.identity 都将返回指定大小的单位矩阵 I。例如:

    np.eye(3) # np.identity(3)
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    

    假设M 是方形的并且使用dtype=int,这就是您想要测试的方式:

    assert (M.shape[0] == M.shape[1]) and (M == np.eye(M.shape[0])).all()
    

    添加检查以确保M 首先是正方形。如果两个二维数组相同,则返回 True

    或者,如果M 是一个浮点矩阵,请改用np.allclose

    assert (M.shape[0] == M.shape[1]) and np.allclose(M, np.eye(M.shape[0]))
    

    【讨论】:

      【解决方案2】:

      == 的一个问题是它比较每个元素,并返回一个布尔矩阵。这不能在if 上下文中使用(你会得到常见的ValueError ... ambiguous 错误):

      In [238]: M=np.diag(1+np.random.random(3)*1e-10)
      In [239]: M
      Out[239]: 
      array([[ 1.,  0.,  0.],
             [ 0.,  1.,  0.],
             [ 0.,  0.,  1.]])
      In [240]: M==np.eye(3)
      Out[240]: 
      array([[False,  True,  True],
             [ True, False,  True],
             [ True,  True, False]], dtype=bool)
      In [241]: np.allclose(M,np.eye(3))
      Out[241]: True
      

      np.allclose 是一种广泛使用的比较数组的方法。它比== 更优雅地处理浮点数。

      使用all将数组归约为标量也被广泛使用:

      In [242]: (M==np.eye(3)).all()
      Out[242]: False
      

      在这里我得到不同的结果,因为我故意创建了一个接近的浮点数,但不完全是一个身份。这就像测试矩阵反转情况时的情况。

      【讨论】:

      • == 失败,因为M1.0000000000124407(等等)而不是1.0(不完全是身份)。
      • 使用 { np.allclose } 比 { (x==y).all } 好,因为我们可以设置容差。检查 { np.allclose } [文档] (docs.scipy.org/doc/numpy/reference/generated/…)
      【解决方案3】:

      您还可以使用内置函数np.equal()np.all() 结合使用,例如:

      In [242]: I = np.eye(3)
      In [243]: M = np.array([[1.0, 0, 0], [0, 1.0, 0], [0, 0, 1.0]])
      
      In [244]: np.all(np.equal(M, I))
      Out[244]: True
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        相关资源
        最近更新 更多