Внутреннее произведение матрицы Python
Я пытаюсь решить вопрос ниже:
'''
Take in two matrices as numpy arrays, X and Y. Determine whether they have an inner product.
If they do not, return False. If they do, return the resultant matrix as a numpy array.
'''
со следующим кодом:
def mat_inner_product(X,Y):
if X.shape != Y.shape:
return False
else:
return np.inner(X,Y)
Я получил следующее сообщение об ошибке:
.F
======================================================================
FAIL: test_mat_inner_product (test_methods.TestPython1)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/src/app/test_methods.py", line 27, in test_mat_inner_product
self.assertTrue(np.array_equal(result2, correct2))
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
Что значит "Ложь не правда"? У меня есть логическая ошибка? Или я должен использовать.dot(), а не.inner()? В чем разница?
1 ответ
Можно рассчитать внутреннее произведение, учитывая, что последнее измерение обеих матриц одинаково. Так что не стоит проверять, X.shape
равно Y.shape
, но только последнее измерение:
def mat_inner_product(X,Y):
if X.shape[-1] != Y.shape[-1]:
return False
else:
return np.inner(X,Y)
Кроме того, число измерений - .ndim
(какой len(X.shape)
- тоже не должно быть одинаковым: вы можете вычислить внутреннее произведение 2-мерной матрицы с 3D-тензором.
Однако вы можете опустить проверку и использовать try
-except
вещь:
def mat_inner_product(X,Y):
try:
return np.inner(X,Y)
except ValueError:
return False
Теперь мы должны полагаться только на то, что numpy
правильно реализовал логику внутренней матрицы и повысит ValueError
в случае, если внутренний продукт не может быть рассчитан.
Или я должен использовать
.dot()
скорее, чем.inner()
? В чем разница?
Разница с точечным произведением заключается в том, что он работает со вторым последним измерением Y
(вместо последнего, который используется в np.inner()
). Так что на случай, если вы будете работать с numpy.dot(..)
проверка будет:
def mat_dot_product(X,Y):
if X.shape[-1] != Y.shape[-2]:
return False
else:
return np.dot(X,Y)
Но опять же, вы можете использовать try
-except
структура здесь.