Spec-Zone.ru › NumPy 1.15

numpy.vectorize

class numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None) [source]

Обобщённый класс функции.

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

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

Параметры:
pyfunc : callable

Функция или метод Python.

otypes : str or list of dtypes, optional

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

doc : str, optional

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

excluded : set, optional

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

Добавлен в версии 1.7.0.

cache : bool, optional

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

Добавлен в версии 1.7.0.

signature : string, optional

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

Добавлен в версии 1.12.0.

Возвращает:
vectorized : callable

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

См. также

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

Примечания

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

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

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

Ссылки

[1] Справочник NumPy, раздел API обобщенных универсальных функций.

Примеры

>>> 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])
<type 'numpy.int32'>
>>> vfunc = np.vectorize(myfunc, otypes=[float])
>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])
<type 'numpy.float64'>

Аргумент excluded может использоваться для предотвращения векторизации над определёнными аргументами. Это может быть полезно для аргументов в виде массивов с фиксированной длиной, таких как коэффициенты для полинома, как в 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=['p'])
>>> vpolyval(p=[1, 2, 3], x=[0, 1])
array([3, 6])

Позиционные аргументы также можно исключить, указав их позицию:

>>> vpolyval.excluded.add(0)
>>> vpolyval([1, 2, 3], x=[0, 1])
array([3, 6])

Аргумент signature позволяет векторизировать функции, которые действуют над нескалярными массивами фиксированной длины. Например, его можно использовать для векторизованного расчёта коэффициента Пирсона и его 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.]])

Методы

__call__(*args, **kwargs) Возвращает массивы с результатами pyfunc векторизованного действия над args и kwargs не входящими в excluded.

© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.15.4/reference/generated/numpy.vectorize.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API