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не указано, то вызов функции с первым аргументом будет использован для определения количества выходных значений. Результаты этого вызова будут кэшироваться, еслиcacheTrueдля предотвращения двойного вызова функции. Однако для реализации кэша исходная функция должна быть обернута, что замедлит последующие вызовы, поэтому делайте это только в том случае, если ваша функция является дорогостоящей.Новый интерфейс с ключевыми словами и аргумент
excludedдополнительно снижают производительность.Ссылки
[R293] Справочник NumPy, раздел Generalized Universal Function 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.13.0/reference/generated/numpy.vectorize.html