Посмотрите на inner
документы:
Ordinary inner product of vectors for 1-D arrays
...
np.inner(a, b) = sum(a[:]*b[:])
С вашими массивами образцов:
In [374]: x1 = np.array([3.0, 2.0, 1.0])
...: x2 = np.array([-2.0, 1.0, 0.0])
In [375]: x1*x2
Out[375]: array([-6., 2., 0.])
In [376]: np.sum(x1*x2)
Out[376]: -4.0
In [377]: np.inner(x1,x2)
Out[377]: -4.0
In [378]: np.dot(x1,x2)
Out[378]: -4.0
In [379]: x1@x2
Out[379]: -4.0
Из вики для dot/scalar/inner product
:
https://en.wikipedia.org/wiki/Dot_product
two equal-length sequences of numbers (usually coordinate vectors) and returns a single number
If vectors are identified with row matrices, the dot product can also
be written as a matrix product
Исходя из мира линейной алгебры, легко представить все в терминах матриц (2d) и векторов, которые представляют собой 1 строку или 1 столбец матрицы. MATLAB / Octave работает в этом контексте. Но numpy
является более общим, с массивами с 0 или более измерениями, а не только с 2.
np.transpose
не добавляет измерения, а просто переставляет существующие. Следовательно, x1.T
ничего не меняет.
Вектор столбца можно сделать с помощью np.array([[1], [0]])
или:
In [381]: x1
Out[381]: array([3., 2., 1.])
In [382]: x1[:,None]
Out[382]:
array([[3.],
[2.],
[1.]])
In [383]: x1.reshape(3,1)
Out[383]:
array([[3.],
[2.],
[1.]])
np.inner
описывает, что происходит, когда входы не 1d, например,Ваша 2d (2,1) форма x
. Он говорит, что использует np.tensordot
, который является обобщением np.dot
, матричного произведения.
In [386]: x = np.array([[1],[0]])
In [387]: x
Out[387]:
array([[1],
[0]])
In [388]: np.inner(x,x)
Out[388]:
array([[1, 0],
[0, 0]])
In [389]: np.dot(x,x.T)
Out[389]:
array([[1, 0],
[0, 0]])
In [390]: x*x.T
Out[390]:
array([[1, 0],
[0, 0]])
Это поэлементное произведение (2,1) и (1,2), приводящее к (2, 2), или внешнее произведение.