Функция broadcast_arrays
Функция broadcast_arrays принимает несколько массивов
и приводит их к форме, которая позволяет выполнять над ними
элементные операции без явного копирования данных.
В результате возвращается кортеж массивов с одинаковой формой.
При необходимости функция расширяет оси со значением размера
1 до требуемой размерности.
Синтаксис
np.broadcast_arrays(*args, subok=False)
Параметр *args принимает массивы для приведения.
Параметр subok (по умолчанию False) определяет,
будут ли возвращаться подклассы ndarray.
Пример
Давайте приведем одномерный и двумерный массивы к общей форме:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([[10], [20], [30]])
res1, res2 = np.broadcast_arrays(arr1, arr2)
print("arr1:", res1)
print("arr2:", res2)
Результат выполнения кода:
arr1: [[1 2 3]
[1 2 3]
[1 2 3]]
arr2: [[10 10 10]
[20 20 20]
[30 30 30]]
Пример
Давайте сравним результат с явным широковещанием через прибавление константы:
import numpy as np
a = np.array([[1], [2], [3]])
b = np.array([10, 20, 30])
broadcasted_a, broadcasted_b = np.broadcast_arrays(a, b)
print("Shape of a:", a.shape)
print("Shape of b:", b.shape)
print("Broadcasted a shape:", broadcasted_a.shape)
print("Broadcasted b shape:", broadcasted_b.shape)
Результат выполнения кода:
Shape of a: (3, 1)
Shape of b: (3,)
Broadcasted a shape: (3, 3)
Broadcasted b shape: (3, 3)
Как видим, оба массива получили форму (3, 3), что позволяет
выполнять операции поэлементно.
Пример
Давайте приведем три массива разной размерности к общей форме:
import numpy as np
x = np.array([1, 2])
y = np.array([[10], [20]])
z = np.array([[[100]], [[200]]])
res_x, res_y, res_z = np.broadcast_arrays(x, y, z)
print("x shape:", res_x.shape)
print("y shape:", res_y.shape)
print("z shape:", res_z.shape)
Результат выполнения кода:
x shape: (2, 2, 2)
y shape: (2, 2, 2)
z shape: (2, 2, 2)
Все три массива приведены к единой форме (2, 2, 2),
хотя изначально их размерности различались.
Пример
Давайте используем функцию в сочетании с поэлементной операцией:
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([[5], [6], [7], [8]])
bc_a, bc_b = np.broadcast_arrays(a, b)
res = bc_a + bc_b
print(res)
Результат выполнения кода:
[[ 6 7 8 9]
[ 7 8 9 10]
[ 8 9 10 11]
[ 9 10 11 12]]
Поэлементное сложение работает корректно после приведения
обоих массивов к форме (4, 4).
Смотрите также
-
функцию
broadcast_to,
которая приводит один массив к заданной форме для широковещания -
функцию
expand_dims,
которая добавляет новую ось в массив -
функцию
atleast_2d,
которая приводит массивы к как минимум двумерной форме -
функцию
atleast_3d,
которая приводит массивы к как минимум трехмерной форме