python numpy ValueError: операнды не могут транслироваться вместе с фигурами

129

В numpy у меня есть два «массива»: Xэто (m,n)и yесть вектор(n,1)

с помощью

X*y

Я получаю сообщение об ошибке

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

Когда (97,2)x(2,1)это явно законная матричная операция и должна дать мне (97,1)вектор

РЕДАКТИРОВАТЬ:

Я исправил это с помощью, X.dot(y)но исходный вопрос все еще остается.

yayu
источник
2
Что такое «исходный вопрос»? X*yне должно работать (и это не так), но np.dot(X,y)и X.dot(y))должно работать (и для меня они работают).
DSM
3
*не является матричным умножением для ndarrayобъектов.
user2357112 поддерживает Монику
Я столкнулся с той же проблемой при решении wT * X, когда это должно быть np.dot (wT, X)
Хуан Замора
X * y выполняет поэлементное умножение
Виктор Зуанацци

Ответы:

93

dotэто матричное умножение, но *делает кое-что еще.

У нас есть два массива:

  • X, форма (97,2)
  • y, форма (2,1)

С массивами Numpy операция

X * y

выполняется поэлементно, но одно или оба значения могут быть расширены в одном или нескольких измерениях, чтобы сделать их совместимыми. Эта операция называется трансляцией. Размеры, у которых размер равен 1 или которые отсутствуют, могут использоваться при трансляции.

В приведенном выше примере размеры несовместимы, потому что:

97   2
 2   1

Здесь есть противоречащие друг другу числа в первом измерении (97 и 2). Вот на что жалуется ValueError выше. Второе измерение подойдет, так как число 1 ни с чем не конфликтует.

Дополнительные сведения о правилах вещания: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Обратите внимание, что если Xи yотносятся к типу numpy.matrix, то звездочку можно использовать для умножения матриц. Я рекомендую держаться подальше отnumpy.matrix , это скорее усложняет, чем упрощает.)

Ваши массивы должны быть в порядке numpy.dot; если вы получаете сообщение об ошибке numpy.dot, у вас должна быть другая ошибка. Если формы не подходят numpy.dot, вы получите другое исключение:

ValueError: matrices are not aligned

Если вы по-прежнему получаете эту ошибку, опубликуйте минимальный пример проблемы. Пример умножения с массивами, имеющими форму вашего, успешен:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
DRV
источник
34

Per Numpy документы :

При работе с двумя массивами NumPy сравнивает их формы поэлементно. Он начинается с конечных размеров и продвигается вперед. Два измерения совместимы, когда:

  • они равны, или
  • один из них 1

Другими словами, если вы пытаетесь перемножить две матрицы (в смысле линейной алгебры), тогда вы хотите, X.dot(y)но если вы пытаетесь транслировать скаляры из матрицы yна, Xтогда вам нужно выполнить X * y.T.

Пример:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])
gobrewers14
источник
11

Возможно, ошибка возникла не в скалярном произведении, а после. Например, попробуйте это

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

np.dot (a, b) будет хорошо; однако np.dot (a, b) * c явно неверен (12x1 X 1x5 = 12x5, который не может поэлементно умножать 5x12), но numpy даст вам

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

Ошибка вводит в заблуждение; однако в этой строке есть проблема.

Кенан
источник
1
Сообщение об ошибке действительно вводит в заблуждение, поскольку кажется, что оно появляется, когда размеры вашей матрицы не подходят для поэлементного умножения.
Аунг Хтет,
7

Используйте np.mat(x) * np.mat(y), это сработает.

user3101695
источник
7

Вы ищите np.matmul(X, y). В Python 3.5+ вы можете использовать X @ y.

iamanigeeit
источник
0

Мы можем запутаться в том, что a * b - это точечный продукт.

Но на самом деле это транслируется.

Точечный продукт: a.dot (b)

Broadcast:

Термин широковещательная передача относится к тому, как numpy обрабатывает массивы с разными размерами во время арифметических операций, которые приводят к определенным ограничениям, меньший массив транслируется по большему массиву, чтобы они имели совместимые формы.

(m, n) + - / * (1, n) → (m, n): операция будет применена к m строкам

Чиа Юнкан
источник