[Навыки разработки] · Глубокое понимание и применение механизма вещания Numpy

искусственный интеллект Python

[Навыки разработки] · Глубокое понимание и применение механизма вещания Numpy

 

1. Описание проблемы

Когда мы используем Numpy для обработки данных, мы часто используем механизм вещания для упрощения операций, таких как добавление числа ко всем элементам или выполнение той же операции на определенных широтах. Механизм вещания очень удобен, но концепция также немного сложна, что может запутать некоторых новичков и вызвать некоторые ошибки при использовании.

В этой статье объясняется концепция и применение механизма вещания в виде практических упражнений, которые применимы не только к Numpy, но и к механизмам вещания TensorFlow, PyTorch и MxNet.

 

2. Объяснение принципа

Механизм трансляции следует следующим правилам:

1. Во-первых, расшириться до того же размера широты на основе самой длинной широты, некоторые широты равны нулю, сначала становятся 1 и транслируются.

2. Сопоставьте справа налево по широте, два массива либо одинаковы по одной широте, либо один из них равен 1.

3. Данные на каждой совпадающей широте копируются и выравниваются на основе самой длинной формы.

 

3. Практические упражнения

>>> import numpy as np
>>> num1 = np.array(3)
>>> num1.shape
()
>>> al = np.ones([1,3])
>>> bl = np.ones([4,1])*2
>>> al
array([[1., 1., 1.]])
>>> bl
array([[2.],
       [2.],
       [2.],
       [2.]])

Мы создали новые данные, где num1 — это скаляр с широтой 0, а al и bl — матрицы с широтой 2.

Теперь мы позволяем al+num1

>>> al_num1 = al+num1
>>> al_num1
array([[4., 4., 4.]])

Согласно правилу сложения матриц форма двух матриц должна быть одинаковой, и добавляются соответствующие элементы.Мы можем обнаружить, что при выполнении широковещательной операции num1 она становится массивом([[3., 3. , 3.]])

По сути, это соответствует трем вышеприведенным правилам: во-первых, два данных сначала обрабатываются по условию 1, и num1 становится массивом ([[3.]]), затем выполняется условие 2, и оно транслируется по условию 3.

В качестве другого примера, пусть al+bl, подобно приведенному выше примеру, и al, и bl были расширены до формы (4, 3), вы можете вычислить и рассуждать в соответствии с правилами самостоятельно.

>>> al_bl = al + bl
>>> al_bl
array([[3., 3., 3.],
       [3., 3., 3.],
       [3., 3., 3.],
       [3., 3., 3.]])

Наконец, несоответствующий пример

>>> cl = np.ones([2,2])*3
>>> cl
array([[3., 3.],
       [3., 3.]])
>>> al_cl = al + cl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (1,3) (2,2) 

Почему эта трансляция не удалась?Мы можем обнаружить, что крайние правые широты cl и al не равны, и ни одна из них не равна 1 или 0 (если это 0, она будет расширена до 1). Так что нельзя транслировать.

Hope this helps