Продукт с точечной матрицей - PullRequest
0 голосов
/ 04 января 2019

Мы все знаем, что скалярное произведение между векторами должно возвращать скаляр:

import numpy as np
a = np.array([1,2,3])
b = np.array([3,4,5])
print(a.shape) # (3,)
print(b.shape) # (3,)
a.dot(b) # 26
b.dot(a) # 26

perfect.НО ПОЧЕМУ, если мы используем «реальный» (взгляните на разницу между вектором строки или столбцом формы numpy.array (R, 1) и (R,) ), произведение числа с точками возвращает ошибку в измерении?

arow = np.array([[1,2,3]])
brow = np.array([[3,4,5]])
print(arow.shape) # (1,3)
print(brow.shape) # (1,3)
arow.dot(brow) # ERROR
brow.dot(arow) # ERROR

acol = np.array([[1,2,3]]).reshape(3,1)
bcol = np.array([[3,4,5]]).reshape(3,1)
print(acol.shape) # (3,1)
print(bcol.shape) # (3,1)
acol.dot(bcol) # ERROR
bcol.dot(acol) # ERROR

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы также можете использовать оператор @, который фактически является умножением матрицы. В этом случае, как и в точечном произведении, вам необходимо знать размеры матриц (ndarray всегда должно быть dim-совместимым), но это более читабельно:

>>> a = np.array([1,2,3])
>>> a.shape
(3,)
>>> b= np.array([[1,2,3]])
>>> b.shape
(1, 3)
>>> a@b
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: shapes (3,) and (1,3) not aligned: 3 (dim 0) != 1 (dim 0)
>>> a@b.T
array([14])
0 голосов
/ 04 января 2019

Потому что, явно добавляя второе измерение, вы больше не работаете с векторами, а с двумерными матрицами.При взятии точечного произведения матриц внутренние размеры произведения должны совпадать.

Поэтому вам необходимо транспонировать одну из ваших матриц.Какой из них вы транспонируете, будет определять смысл и форму результата.

Матрица 1x3, умноженная на 3x1, приведет к матрице 1x1 (т. Е. Скаляру).Это внутренний продукт.Матрица 3x1, умноженная на 1x3, приведет к внешнему произведению 3x3.

...