Как я должен оценить эквивалентность матриц с плавающей запятой? - PullRequest
0 голосов
/ 12 сентября 2018

Работая над проблемой эквивалентности матриц, которая включает в себя множество обратных преобразований, я обнаружил неожиданное поведение, которое хотел уточнить.Я сделал все матрицы эквивалентными здесь, так как фактические преобразования не имеют никакого отношения к моей проблеме.

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 голосов
/ 12 сентября 2018

& делает поразрядно и (см. Википедия ).Кажется, вы хотите проверить, идентичны ли матрицы - т.е. проверить, x == y и x == z, в этом случае вам нужно логический и , например, вот так:

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-матриц ипроверяет равенство, как при проверке x == y, y == z и z == x, но один из них является избыточным.
0 голосов
/ 12 сентября 2018

Согласно документации Numpy для bitwise_and:

"Обрабатываются только целые и логические типы."

Я подозреваю, что это источник вашего TypeError.

Для проверки эквивалентности матриц с плавающей запятой в прошлом я определил приемлемый предел погрешности и проверил, что каждая пара элементов между двумя матрицами находится в этом поле.

...