На этом шаге мы рассмотрим, что это такое и как используется.
Транслирование (broadcasting) означает автоматический процесс приведения двух массивов NumPy к одной форме для применения определенных поэлементных операций. Транслирование тесно связано с атрибутом формы массивов NumPy, который, в свою очередь, тесно связан с понятием осей координат. Так что займемся изучением осей координат, форм и транслирования.
Каждый массив охватывает несколько осей координат, по одной для каждого измерения (пример 3.8).
import numpy as np a = np.array([1, 2, 3, 4]) print(a.ndim) # 1 b = np.array([[2, 1, 2], [3, 2, 3], [4, 3, 4]]) print(b.ndim) # 2 c = np.array([[[1, 2, 3], [2, 3, 4], [3, 4, 5]], [[1, 2, 4], [2, 3, 5], [3, 4, 6]]]) print(c.ndim) # 3
Здесь мы видим три массива: a, b и c. В атрибуте ndim массива хранится количество его осей координат. Мы просто вывели его в командную оболочку для каждого из массивов. Массив a - одномерный, массив b - двумерный, а массив c - трехмерный. У каждого из этих массивов есть атрибут, указывающий его форму: кортеж, содержащий количество элементов по каждой оси. У двумерного массива - два значения в этом кортеже: количество строк и количество столбцов. Для массивов большей размерности i-е значение кортежа задает количество элементов по i-й оси. Следовательно, количество элементов этого кортежа соответствует размерности массива NumPy.
В примере 3.9 мы выводим атрибуты shape тех же самых массивов из примера 3.8.
import numpy as np a = np.array([1, 2, 3, 4]) print(a) # [1 2 3 4] print(a.shape) # (4,) b = np.array([[2, 1, 2], [3, 2, 3], [4, 3, 4]]) print(b) # [[2 1 2] # [3 2 3] # [4 3 4]] print(b.shape) # (3, 3) c = np.array([[[1, 2, 3], [2, 3, 4], [3, 4, 5]], [[1, 2, 4], [2, 3, 5], [3, 4, 6]]]) print(c) # [[[1 2 3] # [2 3 4] # [3 4 5]] # [[1 2 4] # [2 3 5] # [3 4 6]]] print(c.shape) # (2, 3, 3)
Как видите, атрибуты shape содержат намного больше информации, чем атрибуты ndim. Каждый атрибут shape представляет собой кортеж с числом элементов по каждой из осей координат:
Теперь, когда вы разобрались с атрибутом shape, вам будет легче понять общую идею транслирования: приведение двух массивов к одной форме путем переупорядочивания их элементов. Посмотрим, как происходит транслирование. Оно автоматически исправляет поэлементные операции над массивами NumPy различной формы. Например, оператор умножения *, примененный к массивам NumPy, обычно выполняет поэлементное умножение. Но что произойдет, если данные слева и справа от него не совпадают по форме (скажем, операнд слева представляет собой массив NumPy, а справа - значение с плавающей точкой)? В этом случае NumPy не выдаст ошибку, а автоматически создаст новый массив из данных, расположенных справа. Размер и размерность этого нового массива - те же, что и у массива слева, он содержит те же значения с плавающей точкой.
Таким образом, транслирование представляет собой преобразование массива низкой размерности в массив более высокой размерности для осуществления поэлементных операций.
На следующем шаге мы рассмотрим однородные значения.