Введение в NumPy (4)

Транслирование массивов

Иногда бывает необходимо выполнять арифметические операции c массивами разной формы.

Допустим, мы хотим умножить один массив на другой, причем размерность у массивов будет разной:

import numpy as np

a = np.arange(9).reshape(3, 3)
a
b = np.array([3, 5, 7])
b
a * b

С точки зрения линейной алгебры - это бред.

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

Если бы подобный механизм в NumPy отсутствовал, нам пришлось бы делать подобные операции вручную.

Транслирование для двух (и более) массивов выполняется по двум правилам:

  • если массивы имеют различное количество осей (измерений), то к размерностям массивов с недостающими осями будет добавляться единица, до тех пор пока размерности (количество осей) двух массивов не совпадут;

  • если по какой-то из осей находится всего один элемент, то эта ось будет вести себя так, как если бы в ней был не один элемент, а ровно столько, сколько элементов в соответствующей оси другого массива.

Но прежде чем говорить о применении этих правил в транслировании давайте сначала разберем несколько простых примеров. Умножим одномерный массив на число (скаляр).

a = np.arange(1, 11)
a
a * 2

Каждый элемент массива a умножился на число b - ничего сложного. Но давайте перепишем этот пример немного иначе.

a = np.arange(1, 11)
a
b = np.array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
b
a * b

Результат не изменился.

Но во втором случае мы использовали гораздо больше памяти, что не очень-то эффективно.

Теперь давайте попробуем что-нибудь посложнее - умножим каждый столбец двумерного массива на соответствующий элемент из другого, одномерного массива.

a = np.arange(9).reshape(3, 3)
a
b = np.array([3, 5, 7])
b
a + b