Рубрики
Без рубрики

Векторизация Numpy

В этой статье мы изучим векторизацию Numpy в Python. Numpy-это реализация массивов на языке C в Python, которая сравнительно быстрее, но имеет то же самое

Автор оригинала: Pankaj Kumar.

В этой статье мы изучим векторизацию Numpy в Python. Numpy-это реализация массивов на языке C в Python, которая сравнительно быстрее при использовании одного и того же интерпретатора Python. В этой статье мы рассмотрим, как мы можем применить функцию по элементам к последовательности с помощью numpy.vectorize().

Почему цикл for не подходит для векторизации Numpy?

Чтобы применить функцию к элементу списка , кортежа или массива NumPy, мы можем легко использовать цикл for в Python . Но Python-это интерпретируемый язык, и большая часть реализации медленна по сравнению с C и C++. Основная причина такого медленного вычисления сводится к динамической природе Python и отсутствию оптимизации на уровне компилятора, которая приводит к накладным расходам памяти.

Это не идеальная ситуация для людей, которые используют Python для огромных вычислений. Хотя NumPy обеспечивает более быструю реализацию, for loop отнимает часть этой скорости, которую предлагает NumPy. Чтобы устранить это узкое место, NumPy предоставляет функцию векторизации, которая эффективно отображает функцию в последовательности.

numpy.vectorize() vs Python для сравнения скорости векторизации цикла

Итак, давайте проверим скорость python для цикла по сравнению с векторизованной версией. Мы будем использовать функцию timeit, чтобы получить точный тест скорости.

# We use a large array for benchmarking our method
a = np.random.rand(10000)
b = 5

print("Benchmark for the for loop implementation: ")
%timeit [foo(i, b) for i in a]
print()
print("Benchmark for the vecfoo implementation: ")
%timeit vecfoo(a, b)
Выход Vec Ss - Векторизация Numpy

Мы видим, что векторизованная версия более чем в 3 раза быстрее, чем реализация цикла for.

Векторизация Numpy с помощью функции numpy.vectorize()

Функция Numpy vectorize принимает функцию python (py func) и возвращает векторизованную версию функции.

Векторизованная версия функции принимает последовательность объектов или массивов NumPy в качестве входных данных и вычисляет функцию Python над каждым элементом входной последовательности. Векторизация Numpy по существу функционирует подобно python map (), но с дополнительной функциональностью – механизмом вещания NumPy.

Итак, давайте разберемся в функции numpy.vectorize() более подробно:

numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

Необходимые параметры:

py func : Функция, которую мы хотим применить к последовательности объектов

Дополнительные параметры:

  • типы : Выходные типы функции могут быть указаны в виде строки или списка типов данных. Если типы не указаны, а кэш установлен в True , тип вывода определяется вызовом первого элемента ввода.
  • doc : Для указания строки документа созданного. Если не указано, будет использоваться исходная строка документа функции( если таковая имеется).
  • кэш : Если True , то кэшируйте первый вызов функции, определяющий количество выходов, если o типов не предусмотрено.

Векторизация функции

def foo(a, b):
    """
    If a > b return a + b,
    else return a - b.
    """
    if a >= b:
       return a + b
    else:
       return a - b
# Create a vectorized version of foo
vecfoo = np.vectorize(foo)
vecfoo(np.arange(5), 5)
array([-5, -4, -3, -2, -1])
Foo Vs Vec foo

Тип вывода векторизованной функции

Numpy автоматически вычисляет тип вывода функции, если для параметра types установлено значение false. Вот пример, чтобы продемонстрировать это:

a = np.array([1, 2, 3, 4])
b = 2

vecfoo =  np.vectorize(foo)
res = vecfoo(a, b)
print(type(res[0]))

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

a = np.array([1, 2, 3, 4])
b = 2

vecfoo = np.vectorize(foo, otypes=[float])
res = vecfoo(a, b)
print(type(res[0]))

Кэширование в векторизации Numpy

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

Заключительные Замечания

np.vectorize () – это не единственное место, где мы используем векторизацию, мы все время использовали ее в повседневной работе NumPy. Давайте добавим, например:

np.arange(5) + 4
array([4, 5, 6, 7, 8])

То же правило применяется к различным примитивным функциям, таким как вычитание, умножение, грех, cos и т. Д. Эти функции имеют встроенную поддержку векторизации. Но наша собственная версия Python обычно не поддерживает такого рода векторизацию, поэтому нам нужен numpy.vectorize (), чтобы выполнить нашу векторизованную операцию быстро и эффективно.

Рекомендации: