5

确定给定矩阵“M”是否等于恒等式的最佳方法是什么?即类似的东西:

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

3 回答 3

8

np.eye或者np.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]))
于 2017-08-03T15:06:07.097 回答
4

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

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

于 2017-08-03T15:28:28.693 回答
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
于 2018-01-23T01:28:47.077 回答