Внутреннее произведение матрицы 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 структура здесь.

Другие вопросы по тегам