English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Broadcasing NumPy主要用于处理 массивы с различными формами во время арифметических операций. Под воздействием некоторых ограничений, более маленькие массивы "广播" на больших массивах, чтобы они имели совместимые формы.
Операции NumPy обычно выполняются по одному элементу на массивах. В наиболее простом случае два массива должны иметь полностью одинаковую форму, как показано в следующем примере:
>>> import numpy as np >>> a = np.array([1, 2, 3]) >>> b = np.array([2, 2, 2]) >>> a * b array([ 2, 4, 6])
Когда формы двух массивов в вычислении различаются, NumPy автоматически запускает механизм广播. Например:
>>> import numpy as np >>> a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) >>> b = np.array([1,2,3]) >>> print(a + b) [[ 1 2 3] [11 12 13] [21 22 23] [31 32 33]]
Ниже показано, как массив b广播, чтобы стать совместимым с массивом a.
Сложение двумерного массива 4x3 с одномерным массивом длиной 3 эквивалентно повторению массива b в двух измерениях и дальнейшим вычислениям:
>>> import numpy as np >>> a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) >>> b = np.array([1,2,3]) >>> bb = np.tile(b, (4, 1)) # Повторение b по всем измерениям >>> print(a + bb) [[ 1 2 3] [11 12 13] [21 22 23] [31 32 33]]
Когда NumPy выполняет операции над двумя массивами, он сравнивает их формы элемент за элементом. Начинается он с хвостовых размеров и продвигается вперед. Два размера совместимы, когда
Они равны, или
Одно из них равно 1
Если эти условия не выполняются, будет выведена ошибка ValueError: operands could not be broadcast together, указывающая на то, что массивы имеют несовместимые формы. Размер результата массива по каждому из входных осей не равен 1.
Массив не обязан иметь одинаковое количество измерений. Например, если у вас есть массив значений RGB 256x256x3, и вы хотите масштабировать различные значения цветов в изображении по-разному, вы можете умножить изображение на одномерный массив с тремя значениями. По правилам广播а упорядочите размеры хвостовых осей этих массивов, чтобы показать, что они совместимы:
Изображение (3d массив): 256 x 256 x 3 Масштаб (1d массив): 3 Результат (3d массив): 256 x 256 x 3
Когда любая из размеров сравнения равна 1, используется другой размер. Иными словами, размерность, равная 1, растягивается или «копируется», чтобы соответствовать другой размерности. В следующем примере массивы A и B имеют ось длиной 1, которая расширяется до большего размера во время операции广播а:
A (4d массив): 8 x 1 x 6 x 1 B (3d массив): 7 x 1 x 5 Результат (4d массив): 8 x 7 x 6 x 5
Вот несколько примеров:
A (2d массив): 5 x 4 B (1d массив): 1 Результат (2d массив): 5 x 4 A (2d массив): 5 x 4 B (1d массив): 4 Результат (2d массив): 5 x 4 A (3d массив): 15 x 3 x 5 B (3d массив): 15 x 1 x 5 Результат (3d массив): 15 x 3 x 5 A (3d массив): 15 x 3 x 5 B (2d массив): 3 x 5 Результат (3d массив): 15 x 3 x 5 A (3d массив): 15 x 3 x 5 B (2d массив): 3 x 1 Результат (3d массив): 15 x 3 x 5
Вот примеры форм, которые не могут быть переданы в.broadcast_to:
A (1d массив): 3 B (1d массив): 4 # несовпадение хвостовой размерности A (2d массив): 2 x 1 B (3d массив): 8 x 4 x 3 # несовпадение предпоследней размерности
Пример广播а на практике:
>>> import numpy as np >>> x = np.arange(4) >>> xx = x.reshape(4, 1) >>> y = np.ones(5) >>> z = np.ones((3, 4)) >>> x.shape (4,) >>> y.shape (5,) >>> x + y ValueError: операнды не могут быть переданы в.broadcast_to с формами (4,) (5,) >>> xx.shape (4, 1) >>> y.shape (5,) >>> (xx + y).shape (4, 5) >>> xx + y array([[1., 1., 1., 1., 1.], [2., 2., 2., 2., 2.], [3., 3., 3., 3., 3.], [4., 4., 4., 4., 4.]]) >>> x.shape (4,) >>> z.shape (3, 4) >>> (x + z).shape (3, 4) >>> x + z array([[1., 2., 3., 4.], >>> [1., 2., 3., 4.], >>> [1., 2., 3., 4.])
Broadcasing предоставляет удобный способ получить внешнюю积 (или любое другое внешнее действие) двух массивов. Следующий пример показывает внешнюю операцию произведения для двух 1-d массивов:
>>> import numpy as np >>> a = np.array([0.0, 10.0, 20.0, 30.0]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a[:, np.newaxis] + b array([[1., 2., 3.], [11., 12., 13.], [21., 22., 23.], [31., 32., 33.]])
здесь newaxisоператор индексации вставляет новый ось a чтобы сделать его двумерным 4x1массив. Преобразуйте 4x1массив с формой (3,)of bКомбинация, которая создает 4x3Массив.