Spec-Zone.ru › NumPy 2.0

numpy.vectorize

classnumpy.vectorize(pyfunc=np._NoValue, otypes=None, doc=None, excluded=None, cache=False, signature=None)[source]

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

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

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

Параметры:
pyfuncвызываемая функция, необязательно

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

otypesстрока или список типов данных, необязательно

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

docстрока, необязательно

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

excludedмножество, необязательно

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

Введено в версии 1.7.0.

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

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

Введено в версии 1.7.0.

signatureстрока, необязательно

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

Введено в версии 1.12.0.

Возвращает:
outвызываемая функция

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

См. также

frompyfunc

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

Примечания

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

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

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

Ссылки

[1]

Интерфейс обобщенных универсальных функций

Примеры

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

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

>>> @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 как функции.

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

Spec-Zone.ru

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