numpy.vectorize#

class numpy.vectorize(pyfunc=np._NoValue, otypes=None, doc=None, excluded=None, cache=False, signature=None)[source]#

返回一个类似于 pyfunc 的对象,但它接受数组作为输入。

定义一个向量化函数,该函数接受嵌套的序列对象或 numpy 数组作为输入,并返回单个 numpy 数组或 numpy 数组元组。向量化函数对输入数组的连续元组评估 pyfunc,类似于 Python 的 map 函数,但它使用 numpy 的广播规则。

vectorized 的输出数据类型通过使用输入的第一个元素调用函数来确定。这可以通过指定 otypes 参数来避免。

参数::
pyfunc可调用对象,可选

Python 函数或方法。可以省略,以生成带关键字参数的装饰器。

otypes字符串或数据类型列表,可选

输出数据类型。它必须指定为类型代码字符的字符串或数据类型说明符列表。每个输出应有一个数据类型说明符。

doc字符串,可选

函数的文档字符串。如果为 None,则文档字符串将为 pyfunc.__doc__

excluded集合,可选

表示位置或关键字参数的字符串或整数集合,函数将不会针对它们进行向量化。这些参数将直接传递给 pyfunc,不会修改。

版本 1.7.0 中的新增功能。

cache布尔值,可选

如果为 True,则缓存第一个函数调用,该调用会确定输出数量(如果未提供 otypes)。

版本 1.7.0 中的新增功能。

signature字符串,可选

通用函数的通用签名,例如 (m,n),(n)->(m) 用于向量化矩阵-向量乘法。如果提供,pyfunc 将被调用(并预期返回)具有由对应核心维度大小给定的形状的数组。默认情况下,pyfunc 被假定为接受标量作为输入和输出。

版本 1.12.0 中的新增功能。

返回值::
out可调用对象

如果提供了 pyfunc,则为向量化函数,否则为装饰器。

另请参阅

frompyfunc

接受任意 Python 函数并返回一个 ufunc

注释

vectorize 函数主要为了方便提供,而不是为了性能。其实现本质上是一个 for 循环。

如果未指定 otypes,则使用对第一个参数的函数调用来确定输出数量。如果 cacheTrue,则将缓存此调用的结果以防止两次调用该函数。但是,为了实现缓存,原始函数必须被包装,这会减慢后续调用,因此只有在函数很昂贵的情况下才这样做。

新的关键字参数接口和 excluded 参数支持进一步降低性能。

参考文献

示例

>>> 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])
<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 参数允许对作用于固定长度非标量数组的函数进行向量化。例如,您可以将其用于对 Pearson 相关系数及其 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)

将自身作为函数调用。