Матричные формы умножения numpy

В матричном умножении предположим, что A является матрицей 3 x 2 (3 строки, 2 столбца) и B является матрицей 2 x 4 (2 строки, 4 столбца), тогда если матрица C = A * B, то C должно иметь 3 строки и 4 столбца. Почему numpy не делает это умножение? Когда я пытаюсь выполнить следующий код, я получаю сообщение об ошибке: ValueError: operands could not be broadcast together with shapes (3,2) (2,4)

a = np.ones((3,2))
b = np.ones((2,4))
print a*b

Я пытаюсь с транспонированием A и B и alwasy получить тот же ответ. Зачем? Как сделать матричное умножение в этом случае?

Ответ 1

Оператор * для массивов numpy - это умножение по элементам (аналогично произведению Адамара для массивов той же размерности), а не матрица.

Например:

>>> a
array([[0],
       [1],
       [2]])
>>> b
array([0, 1, 2])
>>> a*b
array([[0, 0, 0],
       [0, 1, 2],
       [0, 2, 4]])

Для матричного умножения с массивами numpy:

>>> a = np.ones((3,2))
>>> b = np.ones((2,4))
>>> np.dot(a,b)
array([[ 2.,  2.,  2.,  2.],
       [ 2.,  2.,  2.,  2.],
       [ 2.,  2.,  2.,  2.]])

Кроме того, вы можете использовать класс матрицы:

>>> a=np.matrix(np.ones((3,2)))
>>> b=np.matrix(np.ones((2,4)))
>>> a*b
matrix([[ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.]])

Более подробную информацию о вещании массивов numpy можно найти здесь, и более подробную информацию о классе матрицы можно найти здесь.