import numpy as np
a = np.arange(9).reshape(3, 3)
aВведение в NumPy (4)
Транслирование массивов
Иногда бывает необходимо выполнять арифметические операции c массивами разной формы.
Допустим, мы хотим умножить один массив на другой, причем размерность у массивов будет разной:
b = np.array([3, 5, 7])
ba * bС точки зрения линейной алгебры - это бред.
Но, на самом деле, в таком умножении есть довольно много логики: каждый столбец из первого массива был умножен на соответствующий элемент из второго массива.
Если бы подобный механизм в NumPy отсутствовал, нам пришлось бы делать подобные операции вручную.
Транслирование для двух (и более) массивов выполняется по двум правилам:
если массивы имеют различное количество осей (измерений), то к размерностям массивов с недостающими осями будет добавляться единица, до тех пор пока размерности (количество осей) двух массивов не совпадут;
если по какой-то из осей находится всего один элемент, то эта ось будет вести себя так, как если бы в ней был не один элемент, а ровно столько, сколько элементов в соответствующей оси другого массива.
Но прежде чем говорить о применении этих правил в транслировании давайте сначала разберем несколько простых примеров. Умножим одномерный массив на число (скаляр).
a = np.arange(1, 11)
aa * 2Каждый элемент массива a умножился на число b - ничего сложного. Но давайте перепишем этот пример немного иначе.
a = np.arange(1, 11)
ab = np.array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
ba * bРезультат не изменился.
Но во втором случае мы использовали гораздо больше памяти, что не очень-то эффективно.
Теперь давайте попробуем что-нибудь посложнее - умножим каждый столбец двумерного массива на соответствующий элемент из другого, одномерного массива.
a = np.arange(9).reshape(3, 3)
ab = np.array([3, 5, 7])
ba + b