In [345]: a = np.array([1, 2, 3])
...: b = np.array([4, 5, 6])
В numpy
существуют различные способы «умножения» двух одномерных массивов:
Поэлементно:
In [346]: a * b
Out[346]: array([ 4, 10, 18])
Внутреннее или скалярное произведение:
In [347]: np.dot(a,b)
Out[347]: 32
In [348]: a@b
Out[348]: 32
In [349]: np.inner(a,b)
Out[349]: 32
In [356]: Out[346].sum() # or sum of the elementwise products
Out[356]: 32
Внешний продукт:
In [350]: np.outer(a,b)
Out[350]:
array([[ 4, 5, 6],
[ 8, 10, 12],
[12, 15, 18]])
In [351]: a[:,None] * b
Out[351]:
array([[ 4, 5, 6],
[ 8, 10, 12],
[12, 15, 18]])
np.transpose
меняет местами существующие оси, но не добавляет ни одной. Изменение формы или индексирование с помощью np.newaxis/None
делает следующее:
In [352]: a[:,None] # a.reshape(3,1)
Out[352]:
array([[1],
[2],
[3]])
In [353]: a * b[:,None] # transpose of [351]
Out[353]:
array([[ 4, 8, 12],
[ 5, 10, 15],
[ 6, 12, 18]])
Точечное / матричное произведение с (3,1) b
дает результат в форме (1,) (сравните со скаляром в [ 347]:
In [354]: np.dot(a ,b[:,None])
Out[354]: array([32])
Или поставьте точку (1,3) над (3,1), чтобы получить результат (1,1):
In [355]: np.dot(a[None,:] ,b[:,None])
Out[355]: array([[32]])