广义函数类。
定义一个矢量化函数,该函数将对象或numpy数组的嵌套序列作为输入,并返回单个numpy数组或numpy数组的元组。除了使用numpy的广播规则外,矢量化函数会像python map函数一样在输入数组的连续元组上评估pyfunc。
向量化输出的数据类型是通过使用输入的第一个元素调用函数来确定的。通过指定otypes参数可以避免这种情况。
参数:pyfunc: : callable
python函数或方法。
otypes: : str 或 list of dtypes, 可选参数
输出数据类型。必须将其指定为一串类型代码字符或一列数据类型说明符。每个输出应有一个数据类型说明符。
doc: : str, 可选参数
该函数的文档字符串。如果为None,则文档字符串将为pyfunc.__doc__。
excluded: : set, 可选参数
一组字符串或整数,表示位置或关键字参数,对于这些位置或关键字参数将不进行矢量化处理。这些将直接传递给未经修改的pyfunc。
1.7.0版中的新功能。
cache: : bool, 可选参数
如果为True,则在未提供otypes的情况下,缓存确定输出数量的第一个函数调用。
New in version 1.7.0.
signature: : string, 可选参数
通用通用函数签名,例如(m,n),(n)->(m)用于向量化的matrix-vector乘法。如果提供,pyfunc将被调用(并期望返回)数组,其形状由相应核心尺寸的大小确定。默认情况下,pyfunc假定将标量作为输入和输出。
1.12.0版中的新功能。
返回值:vectorized: : 可召回的
向量化功能。
注意:
的vectorize提供功能主要是为了方便,而不是为了提高性能。该实现实质上是一个for循环。
如果未指定otypes,则将使用对带有第一个参数的函数的调用来确定输出的数量。如果cache为True,则将缓存此调用的结果,以防止两次调用该函数。但是,要实现缓存,必须包装原始函数,这会减慢后续调用的速度,因此仅在函数昂贵时才这样做。
新的关键字参数接口和排除的参数支持进一步降低了性能。
参考文献:
[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])
>>> vfunc = np.vectorize(myfunc, otypes=[float])
>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])
排除的参数可用于防止对某些参数进行向量化。这对于固定长度的array-like个自变量(例如多项式的系数)很有用,例如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-value的矢量化计算:
>>> 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)
返回不包含在args和kwargs上进行pyfunc广播(矢量化)结果的数组。