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 или список типов данных, необязательно
Тип данных выходных данных. Он должен быть указан либо как строка символов типа, либо как список спецификаторов типов данных. Должен быть один спецификатор типа данных для каждого выходного значения.
doc : str, необязательно
Документация для функции. Если
None, документация будетpyfunc.__doc__.excluded : set, необязательно
Множество строк или целых чисел, представляющих позиционные или именованные аргументы, для которых функция не будет векторизована. Они будут переданы напрямую в
pyfuncбез изменений.Введено в версии 1.7.0.
cache : bool, необязательно
Если
True, то кешировать первый вызов функции, определяющий количество выходных данных, еслиotypesне указан.Введено в версии 1.7.0.
signature : строка, необязательно
Обобщённая сигнатура универсальной функции, например,
(m,n),(n)->(m)для векторизованного умножения матрицы на вектор. Если указано,pyfuncбудет вызвана с (и ожидается возвратить) массивами с формами, заданными размером соответствующих основных измерений. По умолчанию предполагается, чтоpyfuncпринимает скаляры в качестве входных данных и выходных данных.Введено в версии 1.12.0.
Возвращает: vectorized : callable
Векторизованная функция.
См. также
-
frompyfunc - Принимает произвольную функцию Python и возвращает ufunc
Замечания
Функция
vectorizeпредоставляется в основном для удобства, а не для производительности. Реализация по существу представляет собой цикл for.Если
otypesне указан, то вызов функции с первым аргументом будет использован для определения количества выходных значений. Результаты этого вызова будут кешироваться, еслиcacheимеет значениеTrue, чтобы предотвратить вызов функции дважды. Однако для реализации кеша исходная функция должна быть обернута, что замедлит последующие вызовы, поэтому делайте это только в том случае, если ваша функция трудоёмкая.Новый интерфейс именованных аргументов и аргумент
excludedещё больше ухудшают производительность.Ссылки
[R288] Справочник 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=[np.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. -
© 2008–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.vectorize.html