Ответ 1
Обратите внимание, что вы работаете не только с 1D-массивами:
In [6]: a.ndim
Out[6]: 1
In [7]: b.ndim
Out[7]: 2
Итак, b
является двумерным массивом.
Вы также видите это на выходе b.shape
: (1,3) указывает два измерения, поскольку (3,) - одно измерение.
Поведение np.dot
отличается для 1D и 2D массивов (из docs):
Для двухмерных массивов это эквивалентно матричному умножению, а для 1-D массивы для внутреннего произведения векторов
Вот почему вы получаете разные результаты, потому что вы смешиваете 1D и 2D массивы. Поскольку b
является двумерным массивом, np.dot(b, b)
пытается умножить матрицу на две матрицы 1x3, что не удается.
С 1D массивами np.dot выполняет скалярное произведение векторов:
In [44]: a = np.array([1,2,3])
In [45]: b = np.array([1,2,3])
In [46]: np.dot(a, b)
Out[46]: 14
In [47]: np.inner(a, b)
Out[47]: 14
С 2D-массивами это матричное умножение (поэтому 1x3 x 3x1 = 1x1 или 3x1 x 1x3 = 3x3):
In [49]: a = a.reshape(1,3)
In [50]: b = b.reshape(3,1)
In [51]: a
Out[51]: array([[1, 2, 3]])
In [52]: b
Out[52]:
array([[1],
[2],
[3]])
In [53]: np.dot(a,b)
Out[53]: array([[14]])
In [54]: np.dot(b,a)
Out[54]:
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
In [55]: np.dot(a,a)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-55-32e36f9db916> in <module>()
----> 1 np.dot(a,a)
ValueError: objects are not aligned