numpy: умножение 2D-массива на 1D-массив

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Допустим, у вас есть массив 2D-векторов:

 v = np.array([ [1, 1], [1, 1], [1, 1], [1, 1]])
v.shape = (4, 2)
  

И массив скаляров:

 s = np.array( [2, 2, 2, 2] )
s.shape = (4,)
  

Я хотел бы получить результат:

 f(v, s) = np.array([ [2, 2], [2, 2], [2, 2], [2, 2]])
  

Теперь выполнение v*s является ошибкой. Тогда, каков наиболее эффективный способ реализации f ?

Ответ №1:

Добавьте новое единственное измерение к вектору:

 v*s[:,None]
  

Это эквивалентно изменению формы вектора как (len (s), 1) . Тогда формы умноженных объектов будут (4,2) и (4,1), которые совместимы из-за правил трансляции NumPy (соответствующие размеры либо равны друг другу, либо равны 1).

Обратите внимание, что когда два операнда имеют неодинаковое количество измерений, NumPy вставит дополнительные сингулярные измерения «перед» операндом с меньшим количеством измерений. Это сделало бы ваш вектор (1,4) несовместимым с (4,2) . Поэтому мы явно указываем, где добавляются дополнительные размеры, чтобы сделать фигуры совместимыми.

Комментарии:

1. Это работает! Не могли бы вы объяснить, почему это работает?

2. @user89: добавлено объяснение.

3. этот синтаксис с None такой же, как и с np.newaxis вместо None (хотя лично я тоже предпочитаю None над np.newaxis ).