numpy.vectorize#

класс numpy.vectorize(pyfunc=np._NoValue, otypes=None, doc=None, исключен=None, cache=False, сигнатура=None)[источник]#

Возвращает объект, который ведёт себя как pyfunc, но принимает массивы на вход.

Определите векторизованную функцию, которая принимает вложенную последовательность объектов или массивов numpy в качестве входных данных и возвращает один массив numpy или кортеж массивов numpy. Векторизованная функция вычисляет pyfunc по последовательным кортежам входных массивов, подобно функции map в Python, но с использованием правил вещания NumPy.

Тип данных вывода векторизованный определяется вызовом функции с первым элементом ввода. Этого можно избежать, указав otypes аргумент.

Параметры:
pyfuncвызываемый объект, необязательный

Функция или метод Python. Может быть опущена для создания декоратора с ключевыми аргументами.

otypesstr или список dtypes, опционально

Тип выходных данных. Должен быть указан либо как строка символов типов, либо как список спецификаторов типов данных. Должен быть один спецификатор типа данных для каждого выхода.

docstr, optional

Строка документации для функции. Если None, строка документации будет pyfunc.__doc__.

исключенset, optional

Набор строк или целых чисел, представляющих позиционные или ключевые аргументы, для которых функция не будет векторизована. Они будут переданы напрямую в pyfunc без изменений.

cachebool, необязательно

Если ни один из otypes ни сигнатура предоставлены, и cache является True, затем кэшировать количество выходов.

сигнатураstring, optional

Обобщенная сигнатура универсальной функции, например, (m,n),(n)->(m) для векторизованного умножения матрицы на вектор. Если предоставлено, pyfunc будет вызываться с (и ожидается, что вернёт) массивы с формами, заданными размером соответствующих основных измерений. По умолчанию pyfunc предполагается, что принимает скаляры на входе и выходе.

Возвращает:
выходcallable

Векторизованная функция, если pyfunc был предоставлен, декоратор в противном случае.

Смотрите также

frompyfunc

Принимает произвольную функцию Python и возвращает ufunc

Примечания

The vectorize Функция предоставляется в первую очередь для удобства, а не для производительности. Реализация по сути является циклом for.

Если ни один из otypes ни сигнатура указаны, то вызов функции с первым аргументом будет использоваться для определения количества выходов. Результаты этого вызова будут кэшированы, если cache является True чтобы предотвратить вызов функции дважды. Однако для реализации кэша исходная функция должна быть обёрнута, что замедлит последующие вызовы, поэтому делайте это только если ваша функция дорогостоящая.

Новый интерфейс аргументов ключевых слов и исключен поддержка аргументов дальше ухудшает производительность.

Ссылки

Примеры

>>> import numpy as np
>>> def myfunc(a, b):
...     "Return a-b if a>b, otherwise return a+b"
...     if a > b:
...         return a - b
...     else:
...         return a + b
>>> vfunc = np.vectorize(myfunc)
>>> vfunc([1, 2, 3, 4], 2)
array([3, 4, 1, 2])

Строка документации взята из входной функции для vectorize если он не указан:

>>> vfunc.__doc__
'Return a-b if a>b, otherwise return a+b'
>>> vfunc = np.vectorize(myfunc, doc='Vectorized `myfunc`')
>>> vfunc.__doc__
'Vectorized `myfunc`'

Тип вывода определяется путем оценки первого элемента входных данных, если не указано иное:

>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])

>>> vfunc = np.vectorize(myfunc, otypes=[float])
>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])

The исключен аргумент может использоваться для предотвращения векторизации определенных аргументов. Это может быть полезно для аргументов, подобных массивам фиксированной длины, таких как коэффициенты для полинома, как в polyval:

>>> def mypolyval(p, x):
...     _p = list(p)
...     res = _p.pop(0)
...     while _p:
...         res = res*x + _p.pop(0)
...     return res

Здесь мы исключаем нулевой аргумент из векторизации, независимо от того, передается ли он по позиции или по ключевому слову.

>>> vpolyval = np.vectorize(mypolyval, excluded={0, 'p'})
>>> vpolyval([1, 2, 3], x=[0, 1])
array([3, 6])
>>> vpolyval(p=[1, 2, 3], x=[0, 1])
array([3, 6])

The сигнатура аргумент позволяет векторизовать функции, которые действуют на нескалярные массивы фиксированной длины. Например, его можно использовать для векторизованного вычисления коэффициента корреляции Пирсона и его p-значения:

>>> import scipy.stats
>>> pearsonr = np.vectorize(scipy.stats.pearsonr,
...                 signature='(n),(n)->(),()')
>>> pearsonr([[0, 1, 2, 3]], [[1, 2, 3, 4], [4, 3, 2, 1]])
(array([ 1., -1.]), array([ 0.,  0.]))

Или для векторизованной свертки:

>>> convolve = np.vectorize(np.convolve, signature='(n),(m)->(k)')
>>> convolve(np.eye(4), [1, 2, 1])
array([[1., 2., 1., 0., 0., 0.],
       [0., 1., 2., 1., 0., 0.],
       [0., 0., 1., 2., 1., 0.],
       [0., 0., 0., 1., 2., 1.]])

Поддерживается синтаксис декоратора. Декоратор может быть вызван как функция для предоставления ключевых аргументов:

>>> @np.vectorize
... def identity(x):
...     return x
...
>>> identity([0, 1, 2])
array([0, 1, 2])
>>> @np.vectorize(otypes=[float])
... def as_float(x):
...     return x
...
>>> as_float([0, 1, 2])
array([0., 1., 2.])

Методы

__call__(*args, **kwargs)

Вызвать self как функцию.