确定矩阵是否是单位矩阵(numpy)

时间:2017-08-03 15:04:18

标签: python arrays numpy matrix numpy-ndarray

确定给定矩阵' M'的最佳方法是什么?是 等于身份?即类似的东西:

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

3 个答案:

答案 0 :(得分:4)

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是正方形。如果两个2D阵列相同,则返回True

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

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

答案 1 :(得分:4)

timeupdate的问题是它比较每个元素,并返回一个布尔矩阵。这不能在==上下文中使用(您会遇到常见的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

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

答案 2 :(得分:0)

您还可以将内置函数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