Изменить форму для умножения/деления массива в python

Я сталкиваюсь с раздражающей проблемой несоответствия формы, когда работаю с массивами одинаковой длины, но один из них имеет только ширину один. Например:

import numpy as np
x = np.ones(80)
y = np.ones([80, 100])
x*y 

ValueError: shape mismatch: objects cannot be broadcast to a single shape

Простое решение — y*x.reshape(x.shape[0],1). Тем не менее, я часто заканчиваю тем, что подустанавливаю один столбец массива, а затем мне приходится назначать это изменение. Есть ли способ избежать этого?


person mike    schedule 18.09.2011    source источник


Ответы (2)


Два довольно простых способа:

(x * y.T).T

or

x.reshape((-1,1)) * y

трансляция в Numpy — очень мощная функция, которая делает именно то, что вы хотите автоматически, но он ожидает, что последняя ось (или оси) массивов будет иметь одинаковую форму, а не первые оси. Таким образом, вам нужно транспонировать y, чтобы он работал.

Второй вариант аналогичен тому, что вы делаете, но -1 обрабатывается как заполнитель для размера массива, что сокращает объем ввода.

person Joe Kington    schedule 18.09.2011
comment
Альтернативой x.reshape((-1, 1)) является x[:, np.newaxis]. Возможно, это более читабельно в формулах - person donkopotamus; 19.09.2011

Предпочтительный метод - использовать "newaxis", т.е.

x[:, numpy.newaxis] * y

Это очень читабельно и эффективно.

person rocksportrocker    schedule 19.09.2011