我应该如何评估浮点 numpy 矩阵的等效性?
How should I evaluate equivalency of floating point numpy matrices?
在处理涉及各种逆变换的矩阵等价问题时,我发现了一些我想澄清的意外行为。我在这里使所有矩阵都相等,因为实际的转换与我遇到的问题并不真正相关。
a = np.matrix([ 1, 1], [-1, 4]])
x = inv(a)
y = inv(a)
z = inv(a)
(x == y & z).all()
Note: x = matrix([ 0.8, -0.2],
[ 0.2, 0.2]])
其中 return 是以下错误消息:
TypeError: ufunc 'bitwise_and' not supported for the input types, and the
inputs could not be safely coerced to any supported types according to the
casting rule ''safe''
引发此错误是因为 &
运算符不能与浮点一起使用吗?以下方法似乎 return 正确答案,但我希望能提供针对给定问题的首选方法。
(np.equal(x, y) & np.equal(y, z)).all()
True
np.equal([x,y,z], [y,z,x]).all()
True
根据 Numpy documentation 对于 bitwise_and
:
"Only integer and boolean types are handled."
我怀疑那是您 TypeError
的来源。
为了检查浮点矩阵的等价性,我过去定义了一个可接受的误差范围,并检查了两个矩阵之间的每对元素是否在该范围内。
&
做 bitwise and (see Wikipedia). It seems you want to check whether the matrices are identical -- i.e. check whether both x == y
and x == z
, in which case you need logical and,例如像这样:
np.logical_and(x==y, x==z).all()
或者,按照评论中的建议,您可以使用 np.isclose
:
np.logical_and(np.isclose(x, y), np.isclose(x, z)).all()
您的两个建议之所以有效的原因是:
- 第一个有效,因为False/True被理解为0/1,所以这种情况下的位运算恰好等于逻辑运算。
- 您的第二个建议是从三个 2D 矩阵构造一个 3D 矩阵并检查是否相等,如检查
x == y
、y == z
和 z == x
,但其中一个是多余的。
在处理涉及各种逆变换的矩阵等价问题时,我发现了一些我想澄清的意外行为。我在这里使所有矩阵都相等,因为实际的转换与我遇到的问题并不真正相关。
a = np.matrix([ 1, 1], [-1, 4]])
x = inv(a)
y = inv(a)
z = inv(a)
(x == y & z).all()
Note: x = matrix([ 0.8, -0.2],
[ 0.2, 0.2]])
其中 return 是以下错误消息:
TypeError: ufunc 'bitwise_and' not supported for the input types, and the
inputs could not be safely coerced to any supported types according to the
casting rule ''safe''
引发此错误是因为 &
运算符不能与浮点一起使用吗?以下方法似乎 return 正确答案,但我希望能提供针对给定问题的首选方法。
(np.equal(x, y) & np.equal(y, z)).all()
True
np.equal([x,y,z], [y,z,x]).all()
True
根据 Numpy documentation 对于 bitwise_and
:
"Only integer and boolean types are handled."
我怀疑那是您 TypeError
的来源。
为了检查浮点矩阵的等价性,我过去定义了一个可接受的误差范围,并检查了两个矩阵之间的每对元素是否在该范围内。
&
做 bitwise and (see Wikipedia). It seems you want to check whether the matrices are identical -- i.e. check whether both x == y
and x == z
, in which case you need logical and,例如像这样:
np.logical_and(x==y, x==z).all()
或者,按照评论中的建议,您可以使用 np.isclose
:
np.logical_and(np.isclose(x, y), np.isclose(x, z)).all()
您的两个建议之所以有效的原因是:
- 第一个有效,因为False/True被理解为0/1,所以这种情况下的位运算恰好等于逻辑运算。
- 您的第二个建议是从三个 2D 矩阵构造一个 3D 矩阵并检查是否相等,如检查
x == y
、y == z
和z == x
,但其中一个是多余的。