确定一个矩阵是否为单位矩阵(numpy)

7
什么是确定给定矩阵“M”是否等于单位矩阵的最佳方法?即类似以下内容的东西:
if numpy.identity(3) == M:
     ...
3个回答

7

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

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

假设 M 是一个正方形且数据类型为 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]))

5
< p > == 的问题在于它比较每个元素,并返回一个布尔矩阵。这不能在 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

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


“==” 失败是因为 M 具有 1.0000000000124407(等等)而不是 1.0(不完全相同)。 - cs95
使用 { np.allclose } 比 { (x==y).all } 更好,因为我们可以设置公差。请检查 { np.allclose } 文档 - Kardi Teknomo

1
你还可以使用内置函数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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接