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