Ваш пример - это один случай из документации np.dot:
dot(a, b, out=None)
Dot product of two arrays. Specifically,
- If `a` is an N-D array and `b` is a 1-D array, it is a sum product over
the last axis of `a` and `b`.
В нем не указан случай для a
1-D и b
ND.
In [106]: a= np.array([1, 2, 3, 2.5])
...: b= np.array([[0.2, 0.8, -0.5, 1.0],
...: [0.5, -0.91, 0.26, -0.5],
...: [-0.26, -0.27, 0.17, 0.87]])
In [107]: a.shape, b.shape
Out[107]: ((4,), (3, 4))
In [108]: np.dot(b, a)
Out[108]: array([ 2.8 , -1.79 , 1.885])
в обозначении einsum
, обратите внимание на общий индекс j
(последняя ось обеих)
In [109]: np.einsum('ij,j->i', b, a)
Out[109]: array([ 2.8 , -1.79 , 1.885])
a
может быть 1d, но он соединен со вторым и последним измерением b
, поэтому мы транспонировали его для сопоставления (4,) с (4,3):
In [113]: np.einsum('i,ij', a, b.T)
Out[113]: array([ 2.8 , -1.79 , 1.885])
In [114]: np.dot(a,b.T)
Out[114]: array([ 2.8 , -1.79 , 1.885])
@
, matmul
описывает случай массива 1d иначе, но результат то же:
- If the first argument is 1-D, it is promoted to a matrix by
prepending a 1 to its dimensions. After matrix multiplication
the prepended 1 is removed.
- If the second argument is 1-D, it is promoted to a matrix by
appending a 1 to its dimensions. After matrix multiplication
the appended 1 is removed.
In [117]: b@a
Out[117]: array([ 2.8 , -1.79 , 1.885])
In [118]: a@b.T
Out[118]: array([ 2.8 , -1.79 , 1.885])