Как я могу узнать, является ли A * B продуктом Адамара или Dot в Numpy?

Если я вижу следующую строку в коде Python, где импортируется numpy:

c = a * b

Каков самый простой и практичный способ определить, выполняется ли эта операция как операция Адамара (поэлементно) или как скалярное произведение (точечно)?

Верно ли, что для произведения Адамара размер столбца и строки A и B должен быть одинаковым. Для скалярного произведения только размер столбца A должен быть таким же, как размер строки B, верно? Итак, я могу посмотреть форму обоих и узнать, какая операция используется?


person user3352632    schedule 25.05.2015    source источник


Ответы (1)


Это обсуждается в PEP 465. Короче говоря, это зависит от типов A и B. Если они numpy.ndarray, звездочка означает, что произведение Адамара и умножение матриц выполняется методом .dot(). Если они numpy.matrix, звездочка означает матричное умножение. Если это какой-то другой тип (например, из библиотеки, отличной от NumPy), вам придется обратиться к документации этого типа. Если они смешанного типа, matrix имеет приоритет (согласно @ajcr в комментариях).

Надеемся, что в Python 3.5 это будет проще, поскольку символ @ вводится как специальный оператор матричного умножения (подробности см. В PEP выше). Он не будет перенесен на 2.7.x, так что это еще одна причина для обновления.

person Kevin    schedule 25.05.2015
comment
Смешивание типов array и matrix означает, что * - это матричное умножение (matrix имеет более высокое значение __array_priority__, поэтому вызывается его метод). - person Alex Riley; 25.05.2015
comment
Между прочим, мне сказали вообще избегать типа matrix - я считаю, что он, по крайней мере, неофициально устарел. - person detly; 25.05.2015
comment
@detly: Да, это обсуждается в PEP. matrix действительно неофициально устарел. - person Kevin; 25.05.2015
comment
Но не ожидайте, что @ заменит * в устаревшем matrix коде. Он может заменить .dot в таких контекстах, как A.dot(B).dot(C), но с меньшей вероятностью заменит np.dot(A,B). - person hpaulj; 25.05.2015
comment
@hpaulj: Я думаю, бесполезно спекулировать до тех пор, пока 3.5 не станет стабильным, и люди действительно начнут использовать эти вещи. Я согласен с тем, что устаревший код вряд ли легко изменит это. - person Kevin; 25.05.2015
comment
Даже когда Python предоставляет оператор @, его реализация должна быть реализована сообществом numpy, разработчиками и пользователями. github.com/numpy/numpy/issues/4464 - person hpaulj; 25.05.2015