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

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

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

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

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

 (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 Solutions collect form web for “Точечный продукт вектора в SciPy / NumPy (получение ValueError: объекты не выровнены)”

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

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

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

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

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

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

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

 dot(WT,W) 

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

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

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

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

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

 >>> 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 – это WT

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

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

Подробнее см. В документах numpy .

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

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

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

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

  • dfitpack.error: (m> k) не удалось скрыть m: fpcurf0: m = 1
  • Cx_freeze ImportError нет модуля с именем scipy
  • Как получить основу сплайна, используемую scipy.interpolate.splev
  • Лучший способ написать функцию Python, которая объединяет гауссово?
  • Изготовление спектрограммы из микрофона
  • Якобиан и Гессен в `scipy.optimize.minimize`
  • Установка элементов в атрибуте .data на ноль неприятного поведения в scipy.sparse
  • подгонка кривой суммой гауссовых с scipy
  • Умножить матрицы высокого порядка с numpy
  • SciPy и scikit-learn - ValueError: несоответствие размеров
  • scipy.sparse dot чрезвычайно медленный в Python
  • Python - лучший язык программирования в мире.