我应该如何评估浮点数numpy矩阵的等效性?

时间:2018-09-12 14:23:42

标签: python numpy matrix bitwise-and

在处理涉及各种逆变换的矩阵对等问题时,我发现了一些想澄清的意外行为。我在这里已经使所有矩阵等效,因为实际的转换与我遇到的问题并不真正相关。

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]]) 

哪个返回以下错误消息:

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''

是否由于&运算符不能用于浮点数而引发此错误?以下方法似乎返回正确的答案,但对于给定问题的首选方法,我将不胜感激。

(np.equal(x, y) & np.equal(y, z)).all()
True

np.equal([x,y,z], [y,z,x]).all()
True

2 个答案:

答案 0 :(得分:1)

根据bitwise_and的{​​{3}}:

“仅处理整数和布尔类型。”

我怀疑这是您的TypeError的来源。

为检查浮点矩阵的等效性,我过去定义了可接受的误差范围,并检查了两个矩阵之间的每对元素均在该范围内。

答案 1 :(得分:1)

&执行bitwise and(请参阅Wikipedia)。似乎您想检查矩阵是否相同-即检查x == yx == z是否都是这种情况,在这种情况下,您需要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 == yy == zz == x一样检查是否相等,但是其中之一是多余的。 li>