Подтвердить что ты не робот

Точечный продукт вектора в SciPy/NumPy (получение ValueError: объекты не выровнены)

Я только начал изучать SciPy и борюсь с самыми основными функциями.

Рассмотрим следующий стандартный вектор:

In [6]: W=array([[1],[2]])

In [7]: print W
[[1]
 [2]]

Если я правильно понимаю, это должно быть представление SciPy стандартного математического вектора 2x1, например:

(1)    
(2)

Точечное произведение этого вектора должно быть просто 1*1+2*2=5. Однако это не работает в SciPy:

In [16]: dot(W, W)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/ingo/<ipython-input-16-961b62a82495> in <module>()
----> 1 dot(W, W)

ValueError: objects are not aligned

Обратите внимание, что работает следующее. Это должен быть вектор формы (1 2), если я не ошибаюсь.

In [9]: V=array([1,2])

In [10]: print V
[1 2]

In [11]: dot(V, V)
Out[11]: 5

Каково мое заблуждение? Что я делаю неправильно?

4b9b3361

Ответ 1

Ключевым моментом здесь является то, что numpy/scipy отличает форму массивов при вычислении точечных продуктов. Глядя на ваш первый пример, W представляет собой массив 2x1:

In [7]: W=array([[1],[2]])

In [8]: print W.shape
------> print(W.shape)
(2, 1)

поэтому необходимо использовать оператор транспонирования для вычисления точечного (внутреннего) произведения W с самим собой:

In [9]: print dot(W.T,W)
------> print(dot(W.T,W))
[[5]]

In [10]: print np.asscalar(dot(W.T,W))
-------> print(np.asscalar(dot(W.T,W)))
5

Ответ 2

Вы должны использовать vdot: "Вернуть точечный продукт двух векторов". Эта функция выравнивает входные аргументы и дает ожидаемые результаты. Для вашего примера:

>>> W = np.array([[1], [2]])
>>> np.vdot(W, W)
5
>>>

Ответ 3

В вашем первом случае numpy генерирует вектор как двумерный массив, в основном матрицу 2 на 1. В этом случае точка-точка не может быть взята, потому что и матрица m-by-n может быть усечена только матрицей n-by-k. Решение состоит в том, чтобы использовать:

dot(W.T,W)

Это то же самое, что и x.x иногда записывается x ^ T x.

Во втором случае для удобства numpy генерирует одномерный массив вместо матрицы, поэтому точечный продукт имеет простое определение. Если вы должны были создать матрицу размером 1 на 2, используя

W = np.array([[1,2]])

то вы получите то же поведение, что и в первом случае.

Ответ 4

Вы ошибаетесь в отношении формы массива, в который вы проходите:

>>> W = np.array([[1], [2]])
>>> W.shape
(2, 1)
>>> W = np.array([1, 2])
>>> W.shape
(2,)

Как вы заметили, использование np.dot во втором определении W работает так, как ожидалось. Чтобы разделить матрицу 2-го на себя, когда она не квадратная, вы должны транспонировать:

>>> W = np.array([[1], [2]])
>>> np.dot(W, W.transpose())
array([[1, 2],
       [2, 4]])

Ярлык для transpose - W.T

Обратите внимание, что форма вывода отличается в зависимости от того, начинаете ли вы с транспозицией или оригиналом, как можно было бы ожидать:

>>> np.dot(W.T, W)
array([[5]])
>>> np.dot(W.T, W).shape
(1, 1)

Подробнее см. numpy.

Ответ 5

Это массив из двух массивов, а не массив из двух значений. Первый из них можно рассматривать как матрицу: две строки по одному столбцу.

Второй правильный; он дает вам правильный правильный точечный продукт. Верьте своим глазам; используйте второй.

Ответ 6

В первом примере W является 2-мерным массивом, тогда как в последнем (тот, который работает), у вас есть только 1 тусклый.

Yon может быть уверен, что второй способ - это правильный способ сделать это.