判断一个矩阵是否为单位矩阵(numpy)
Determine whether a matrix is identity matrix (numpy)
确定给定矩阵 'M' 是否正确的最佳方法是什么
等于身份? IE。类似于:
if numpy.identity(3) == M:
...
np.eye
或 np.identity
都将 return 指定大小的单位矩阵 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
首先是正方形。这 returns True
如果两个二维数组相同。
或者,如果 M
是浮点矩阵,请改用 np.allclose
:
assert (M.shape[0] == M.shape[1]) and np.allclose(M, np.eye(M.shape[0]))
==
的一个问题是它比较每个元素,而 returns 是一个布尔矩阵。这不能在 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
这里我得到了不同的结果,因为我故意创建了一个接近但不完全相同的浮点数。这就像测试矩阵求逆案例时的情况。
您还可以使用内置函数 np.equal()
combined with 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
确定给定矩阵 'M' 是否正确的最佳方法是什么 等于身份? IE。类似于:
if numpy.identity(3) == M:
...
np.eye
或 np.identity
都将 return 指定大小的单位矩阵 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
首先是正方形。这 returns True
如果两个二维数组相同。
或者,如果 M
是浮点矩阵,请改用 np.allclose
:
assert (M.shape[0] == M.shape[1]) and np.allclose(M, np.eye(M.shape[0]))
==
的一个问题是它比较每个元素,而 returns 是一个布尔矩阵。这不能在 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
这里我得到了不同的结果,因为我故意创建了一个接近但不完全相同的浮点数。这就像测试矩阵求逆案例时的情况。
您还可以使用内置函数 np.equal()
combined with 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