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.19/reference/generated/numpy.vectorize.html