Векторизация и вещание в Python
Опубликовано: 2020-12-01Векторизация и широковещательная передача — это способы ускорить время вычислений и оптимизировать использование памяти при выполнении математических операций с помощью Numpy. Эти методы имеют решающее значение для обеспечения снижения временной сложности, чтобы алгоритмы не сталкивались с какими-либо узкими местами. Эта оптимизированная операция необходима для масштабируемости приложений. Мы рассмотрим обе эти техники и реализуем несколько примеров.
К концу этого урока вы будете знать следующее:
- Как векторизация обрабатывается Numpy
- Разница во времени с векторизацией и без нее
- Что такое вещание
- Чем трансляция отличается от обычного матричного умножения
Векторизация
Часто нам требуются математические операции с массивами, например умножение массивов. Теперь невекторизованным способом было бы поэлементное умножение с использованием цикла. Реализация таким образом приведет к тому, что одна и та же операция умножения будет выполняться несколько раз, что будет пустой тратой вычислительных ресурсов, если размер данных слишком велик. Давайте быстро посмотрим.
Не векторизованный способ:
Импорт случайного a = [random.randint( 1 , 100 ) для _ в диапазоне( 10000 )] |
#Выход: >> 1000 циклов, лучшее из 3 : 658 мкс на цикл |
Векторизованный способ:
импортировать numpy как np a = np.array([random.randint( 1 , 100 ) для _ в диапазоне( 10000 )]) b = np.array([random.randint( 1 , 100 ) для _ в диапазоне( 10000 )]) %timeit a*b |
#Выход: >> 100000 циклов, лучшее из 3 : 7,25 мкс на цикл |
Как мы видим, прошедшее время увеличилось с 658 микросекунд до 7,25 микросекунд. Это потому, что когда мы говорим a = np.array([]) , все операции выполняются внутри numpy. И когда мы делаем a*b , numpy внутренне умножает сразу весь массив с помощью векторизации.
Здесь мы используем волшебную команду %timeit для определения времени выполнения процесса, который может отличаться на вашей машине.
Давайте посмотрим на другой пример внешнего произведения двух векторов с размерами (nx1) и (1xm). Результат будет (nxm).
время импорта импортировать numpy массив импорта a = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) b = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) |
T1 = время.процесс_время() c = число.нули (( 200 , 200 )) для i в диапазоне (len (a)): для j в диапазоне (len (b)): с [я] [j] = а [я] * b [j] T2 = время.процесс_время() print( f"Время вычисления = { 1000 *(T2-T1)} мс" ) |
#Выход: >> Время вычисления = 6,819299000000001 мс |
Теперь давайте сделаем это с Numpy,
T1 = время.процесс_время() с = numpy.outer (а, б) T2 = время.процесс_время() print( f"Время вычисления = { 1000 *(T2-T1)} мс" ) |
#Выход: >> Время вычисления = 0,2256630000001536 мс |
Как мы снова видим, Numpy обрабатывает ту же операцию намного быстрее за счет векторизации.
Обязательно к прочтению: Увлекательные приложения Python в реальном мире
Итак, до сих пор мы видели примеры, когда использовались массивы одинакового размера. Что делать, если размеры массивов разные? Вот где появляется еще одна замечательная функция Numpy, Broadcasting.
Вещание — это еще одно расширение векторизации, когда массивы не обязательно должны быть одного размера для выполнения над ними таких операций, как сложение, вычитание, умножение и т. д. Давайте разберемся с этим на очень простом примере сложения массива и скаляра.
а = np.массив ([ 1 , 1 , 1 , 1 ]) а+ 5 |
#Выход: массив([ 6 , 6 , 6 , 6 ]) |
Как видим, ко всем элементам прибавился скаляр 5. Так как же это произошло?

Чтобы представить процесс, вы можете представить, что скаляр 5 повторяется 4 раза, чтобы создать массив, который затем добавляется к массиву a. Но имейте в виду, Numpy не создает таких массивов, которые будут занимать только память. Numpy просто «транслирует» или дублирует скаляр от 5 до 4 мест, чтобы добавить его в массив a.
Возьмем еще один простой пример.
a = np.ones (( 3 , 3 )) b = np.ones( 3 ) а+б |
#Выход: >> массив([[ 2. , 2. , 2. ], [ 2. , 2. , 2. ], [ 2. , 2. , 2. ]]) |
В приведенном выше примере массив формы (3,1) был передан в (3,3), чтобы соответствовать массиву a.
Но означает ли это, что любой массив с любым измерением может быть транслирован для сопоставления с массивом с любым измерением?
НЕТ!
Правила трансляции
Numpy следует набору простых правил, чтобы убедиться, что транслируются только массивы, соответствующие критериям. Давайте взглянем.
Правило вещания гласит, что 2 массива, с которыми нужно работать, должны либо иметь одинаковые размеры, либо любой из них равен 1.
Давайте посмотрим, что это в действии.
Пример 1:
Рассмотрим ниже массивы измерений:
а = 3 х 4 х 7
б = 3 х 4 х 1
Здесь последнее измерение b будет транслироваться так, чтобы оно соответствовало измерению от a до 7.
Следовательно, результат = 3 х 4 х 7
Пример 2:
а = 3 х 4 х 7
б = 4
Теперь количество измерений a и b неодинаково. В таких случаях массив с меньшим количеством измерений будет дополнен 1.
Итак, здесь первое и последнее измерения b равны 1, поэтому они будут транслироваться так, чтобы соответствовать размерам a до 3 и 7.
Следовательно, результат = 3 х 4 х 7.
Читайте: Учебник по Python
Пример 3:
а = 3 х 4 х 1 х 5
б = 3 х 1 х 7 х 1
Здесь, опять же, второе и последнее измерения b будут переданы так, чтобы соответствовать размерам a до 4 и 5. Кроме того, третье измерение a будет передано так, чтобы соответствовать размеру b до 7.
Следовательно, результат = 3 х 4 х 7 х 5
Теперь давайте посмотрим, когда условие не выполняется:
Пример 4:
а = 3 х 4 х 7 х 5
б = 3 х 3 х 7 х 4
Здесь второе и четвертое измерения b не совпадают с a и не равны 1. В этом случае Python выдаст ошибку значения:
ValueError: операнды не могут быть переданы вместе с формами ( 3 , 4 , 7 , 5 ) ( 3 , 3 , 7 , 4 ) |
Пример 5:
а = 3 х 4 х 1 х 5
б = 3 х 2 х 3
Результат: Валуееррор
Здесь также второе измерение не совпадает и не равно 1 ни для одного из них.
Прежде чем ты уйдешь
Векторизация и вещание — это методы, с помощью которых Numpy оптимизирует и делает обработку более эффективной. Эти концепции следует помнить, особенно при работе с матрицами и n-мерными массивами, которые очень распространены в данных изображений и нейронных сетях.
Если вам интересно узнать о python и науке о данных, ознакомьтесь с дипломом PG IIIT-B и upGrad по науке о данных, который создан для работающих профессионалов и предлагает более 10 тематических исследований и проектов, практические семинары, наставничество с отраслевыми экспертами, Индивидуальные встречи с отраслевыми наставниками, более 400 часов обучения и помощь в трудоустройстве в ведущих фирмах.
Что такое векторизация в Python?
Numpy — это пакет Python, предоставляющий несколько стандартных математических функций, позволяющих быстро выполнять операции с большими массивами данных без необходимости циклов, включая векторизацию. Векторизация используется для ускорения программ Python без использования циклов. Использование такого метода может помочь сократить время выполнения кода. Существуют различные операции, которые выполняются над векторами, такие как скалярное произведение векторов, также известное как скалярное произведение, потому что оно дает один выход, внешние произведения, в результате чего получается квадратная матрица размерности, равной длине x длине вектора. векторов, поэлементное умножение, которое производит элементы с одинаковыми индексами.
Что такое вещание в Python?
Слово широковещание относится к тому, как Numpy управляет массивами с разными размерами во время арифметических операций, которые приводят к определенным ограничениям; меньший массив транслируется по огромному массиву, чтобы их формы были согласованы. Вещание позволяет вам векторизовать операции с массивами, так что зацикливание происходит в C, а не в Python, как это делает Numpy. Это достигается без создания ненужных копий данных, что приводит к эффективной реализации алгоритма. В определенных ситуациях широковещательная рассылка является негативной идеей, поскольку приводит к расточительному потреблению памяти, что замедляет обработку.
Каково использование NumPy в Python?
NumPy или Numerical Python — это бесплатная библиотека Python с открытым исходным кодом, используемая практически в каждой исследовательской и инженерной отрасли. Библиотека NumPy включает многомерные массивы и матричные структуры данных и предлагает методы для эффективной работы с массивом, однородным n-мерным объектом массива. Пользователи могут использовать NumPy для выполнения широкого спектра математических операций с массивами. Он дополняет Python сильными структурами данных, обеспечивающими эффективные вычисления с массивами и матрицами, а также обширной библиотекой высокоуровневых математических функций, которые работают с этими массивами и матрицами.