NumPy broadcasting для эффективных вычислений

NumPyNumPyBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Браodcasting - это мощный функционал в NumPy, который позволяет использовать массивы с разными формами в арифметических операциях. Он обеспечивает способ векторизации операций с массивами и повышения вычислительной эффективности. В этом практикуме вы познакомитесь с основами broadcasting в NumPy.

Примечание: Вы можете писать код в 05-broadcasting.ipynb. В некоторых шагах некоторые операции вывода опущены, и вы можете выводить результат по необходимости.

Взаимодействие с broadcasting

Broadcasting позволяет NumPy выполнять поэлементные операции с массивами различных форм. Малый массив автоматически "распространяется", чтобы соответствовать форме большего массива. Это происходит под определенными ограничениями, которые мы рассмотрим в следующих шагах.

Broadcasting с массивами одинаковой формы

В простейшем случае для поэлементных операций два массива должны иметь ровно одинаковую форму. Например:

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
result = a * b

В этом случае a и b имеют одинаковую форму, поэтому умножение выполняется поэлементно и результат равен [2.0, 4.0, 6.0].

Broadcasting с скалярным значением

Broadcasting также позволяет выполнять поэлементные операции между массивом и скалярным значением. Скалярное значение автоматически "растягивается", чтобы соответствовать форме массива. Например:

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = 2.0
result = a * b

В этом случае b - это скалярное значение, но оно растягивается, чтобы стать массивом с той же формой, что и a. Затем умножение выполняется поэлементно, и получается [2.0, 4.0, 6.0].

Общие правила broadcasting

NumPy сравнивает формы двух массивов поэлементно, чтобы определить, совместимы ли они для broadcasting. Применяются следующие правила:

  1. Две размерности совместимы, если они равны по размеру.
  2. Две размерности совместимы, если одна из них имеет размер 1.

Если эти условия не выполняются, возникает ValueError, указывающий на несоответствие форм массивов.

Примеры broadcasting

Рассмотрим несколько примеров, чтобы понять, как работает broadcasting в различных сценариях.

  • Пример 1:
import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 2.0, 3.0])
result = a + b

В этом случае b добавляется к каждой строке a. Результат - это двумерный массив с той же формой, что и a, где каждый элемент равен сумме соответствующих элементов в a и b.

  • Пример 2:
import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 2.0])
result = a + b

В этом случае broadcasting завершается с ошибкой, потому что конечные размерности a и b не равны. Невозможно выровнять значения в строках a с элементами b для поэлементного сложения.

Практический пример - Векторная квантизация

Рассмотрим практический пример, где broadcasting полезен. Возьмем алгоритм векторной квантизации (VQ), используемый в теории информации и классификации. Основная операция в VQ - найти ближайшую точку в наборе точек к заданной точке. Это можно сделать с использованием broadcasting. Вот пример:

import numpy as np

observation = np.array([111.0, 188.0])
codes = np.array([[102.0, 203.0],
                  [132.0, 193.0],
                  [45.0, 155.0],
                  [57.0, 173.0]])
diff = codes - observation
dist = np.sqrt(np.sum(diff**2, axis=-1))
closest_index = np.argmin(dist)
closest_code = codes[closest_index]

В этом примере observation представляет вес и рост спортсмена, которого нужно классифицировать, а codes представляет разные классы спортсменов. Вычитанием observation из codes с использованием broadcasting вычисляется расстояние между observation и каждым из кодов. Затем функция argmin используется для нахождения индекса ближайшего кода.

Резюме

В этом практическом занятии мы изучили broadcasting в NumPy. Broadcasting позволяет выполнять поэлементные операции над массивами различных форм, что делает его мощным инструментом для векторизации операций с массивами и повышения вычислительной эффективности. Изучив правила broadcasting и используя его правильно, вы можете упростить и оптимизировать свой код.