numpy.vectorize
-
class numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)[source] -
Обобщённый класс функции.
Определяет векторизованную функцию, которая принимает вложенную последовательность объектов или массивов NumPy в качестве входных данных и возвращает один массив NumPy или кортеж массивов NumPy. Векторизованная функция вычисляет
pyfuncнад последовательными кортежами входных массивов, подобно функции python map, но использует правила трансляции NumPy.Тип данных выходных данных
vectorizedопределяется вызовом функции с первым элементом входных данных. Этого можно избежать, указав аргументotypes.- Параметры
-
-
pyfunccallable -
Функция или метод Python.
-
otypesstr or list of dtypes, optional -
Тип данных выходных данных. Он должен быть указан как строка кодов типа или список спецификаторов типов данных. Должен быть один спецификатор типа данных для каждого выхода.
-
docstr, optional -
Документация функции. Если None, документация будет
pyfunc.__doc__. -
excludedset, optional -
Набор строк или целых чисел, представляющих позиционные или именованные аргументы, для которых функция не будет векторизована. Они будут переданы непосредственно в
pyfuncбез изменений.Новое в версии 1.7.0.
-
cachebool, optional -
Если
True, то кэшировать первый вызов функции, определяющий количество выходов, еслиotypesне указано.Новое в версии 1.7.0.
-
signaturestring, optional -
Обобщённая сигнатура универсальной функции, например,
(m,n),(n)->(m)для векторизованного умножения матрицы на вектор. Если предоставлено,pyfuncбудет вызываться с (и ожидается возвращение) массивами с формами, заданными размером соответствующих основных измерений. По умолчанию предполагается, чтоpyfuncпринимает скаляры в качестве входных данных и выдает скаляры.Новое в версии 1.12.0.
-
- Возвращает
-
-
vectorizedcallable -
Векторизованная функция.
-
См. также
-
frompyfunc -
Принимает произвольную функцию Python и возвращает ufunc
Примечания
Функция
vectorizeпредоставлена в основном для удобства, а не для производительности. Реализация по существу представляет собой цикл for.Если
otypesне указано, то вызов функции с первым аргументом будет использован для определения количества выходов. Результаты этого вызова будут кэшированы, еслиcacheравноTrueдля предотвращения повторного вызова функции. Однако для реализации кэша исходная функция должна быть обернута, что замедлит последующие вызовы, поэтому делайте это только в том случае, если ваша функция дорогостоящая.Новый интерфейс с ключевыми словами и аргумент
excludedеще больше ухудшают производительность.Ссылки
-
R5cc1f1f25381-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]) <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.]])Методы
__call__(self, \*args, \*\*kwargs)Возвращает массивы с результатами
pyfuncтрансляции (векторизации) поargsиkwargsне входящим вexcluded.
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/generated/numpy.vectorize.html