Numpy: 1D массив с различной формой - программирование
Подтвердить что ты не робот

Numpy: 1D массив с различной формой

Я пытаюсь понять, как обрабатывать 1D массив (вектор в линейной алгебре) с NumPy.

В следующем примере я генерирую два numpy.array a и b:

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([[1],[2],[3]]).reshape(1,3)
>>> a.shape
(3,)
>>> b.shape
(1, 3)

Для меня a и b имеют одинаковую форму в соответствии с определением линейной алгебры: 1 строка, 3 столбца, но не для NumPy.

Теперь продукт NumPy dot:

>>> np.dot(a,a)
14
>>> np.dot(b,a)
array([14])
>>> np.dot(b,b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: objects are not aligned

У меня есть три разных выхода.

В чем разница между dot(a,a) и dot(b,a)? Почему точка (b,b) не работает?

У меня также есть некоторые различия с этими точечными продуктами:

>>> c = np.ones(9).reshape(3,3)
>>> np.dot(a,c)
array([ 6.,  6.,  6.])
>>> np.dot(b,c)
array([[ 6.,  6.,  6.]])
4b9b3361

Ответ 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