Шаг 37.
Однострочники Python. Наука о данных. Работа с массивами NumPy: срезы, транслирование и типы массивов. Общее описание. Транслирование

    На этом шаге мы рассмотрим, что это такое и как используется.

    Транслирование (broadcasting) означает автоматический процесс приведения двух массивов NumPy к одной форме для применения определенных поэлементных операций. Транслирование тесно связано с атрибутом формы массивов NumPy, который, в свою очередь, тесно связан с понятием осей координат. Так что займемся изучением осей координат, форм и транслирования.

    Каждый массив охватывает несколько осей координат, по одной для каждого измерения (пример 3.8).


Пример 3.8. Оси координат и размерность трех массивов NumPy
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.


При повышении размерности массива (например, при переходе от двумерного к трехмерному массиву) новая ось становится осью 0, а i-я ось массива более низкой размерности становится (i + 1)-й осью массива более высокой размерности.

    В примере 3.9 мы выводим атрибуты shape тех же самых массивов из примера 3.8.


Пример 3.9. Формы одномерного, двумерного и трехмерного массивов NumPy
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 не выдаст ошибку, а автоматически создаст новый массив из данных, расположенных справа. Размер и размерность этого нового массива - те же, что и у массива слева, он содержит те же значения с плавающей точкой.

    Таким образом, транслирование представляет собой преобразование массива низкой размерности в массив более высокой размерности для осуществления поэлементных операций.

    На следующем шаге мы рассмотрим однородные значения.




Предыдущий шаг Содержание Следующий шаг