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