English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Broadcasing NumPy主要用于处理 массивы с различными формами во время арифметических операций. Под влиянием некоторых ограничений, более мелкие массивы «бroadcast» на более крупные, чтобы они имели совместимые формы.
Операции 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 4 раза в двумерном измерении и дальнейшим вычислением:
>>> 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
Вот примеры форм, которые не могут быть广播аны:
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: operands could not be broadcast together with shapes (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.])
Broadcating предоставляет удобный способ получить внешнюю积 (или любое другое внешнее действие) двух массивов. Следующий пример показывает внешнюю операцию внешнего продукта двух 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,)в bКомбинация, которая создает 4x3Массив.