Точечный продукт вектора в SciPy / NumPy (получение ValueError: объекты не выровнены) - PullRequest
13 голосов
/ 10 февраля 2012

Я только начал изучать 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

В чем мое заблуждение? Что я делаю не так?

Ответы [ 6 ]

13 голосов
/ 10 февраля 2012

Ключевым моментом здесь является то, что 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
10 голосов
/ 13 марта 2013

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

>>> W = np.array([[1], [2]])
>>> np.vdot(W, W)
5
>>>
4 голосов
/ 10 февраля 2012

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

dot(W.T,W)

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

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

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

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

3 голосов
/ 10 февраля 2012

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

>>> 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 .

0 голосов
/ 10 февраля 2012

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

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

0 голосов
/ 10 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...