numpy.vectorize#
- class numpy.vectorize(pyfunc=np._NoValue, otypes=None, doc=None, excluded=None, cache=False, signature=None)[源代码]#
返回一个类似于 pyfunc 的对象,但将数组作为输入.
定义一个向量化的函数,该函数接受对象或 numpy 数组的嵌套序列作为输入,并返回单个 numpy 数组或 numpy 数组的元组. 向量化函数像 Python 的 map 函数一样,对输入数组的连续元组计算 pyfunc ,但它使用 numpy 的广播规则.
vectorized 的输出数据类型通过使用输入的第一个元素调用函数来确定.可以通过指定 otypes 参数来避免这种情况.
- 参数:
- pyfunccallable, 可选
一个 python 函数或方法. 可以省略以生成带有关键字参数的装饰器.
- otypesstr 或 dtypes 列表,可选
输出数据类型. 必须将其指定为类型代码字符的字符串或数据类型说明符的列表. 每个输出都应有一个数据类型说明符.
- docstr, optional
该函数的文档字符串. 如果为 None,则文档字符串将为
pyfunc.__doc__.- excluded集合,可选
字符串或整数的集合,表示函数将不被向量化的位置或关键字参数. 这些将直接传递到 pyfunc ,不作修改.
- cachebool,可选
如果为 True ,则缓存确定输出数量的第一个函数调用(如果未提供 otypes ).
- signaturestring,可选
广义通用函数签名,例如,
(m,n),(n)->(m)用于向量化矩阵-向量乘法. 如果提供,将使用(并期望返回)形状由相应核心维度的大小给出的数组调用pyfunc. 默认情况下,假定pyfunc将标量作为输入和输出.
- 返回:
- outcallable
如果提供了
pyfunc,则为向量化函数,否则为装饰器.
参见
frompyfunc接受任意 Python 函数并返回 ufunc
注释
提供
vectorize函数主要是为了方便,而不是为了性能. 该实现本质上是一个 for 循环.如果未指定 otypes ,则将使用带有第一个参数的函数调用来确定输出的数量. 如果 cache 为 True ,则将缓存此调用的结果,以防止两次调用该函数. 但是,为了实现缓存,必须包装原始函数,这将减慢后续调用,因此仅当您的函数开销很大时才执行此操作.
新的关键字参数接口和 excluded 参数支持进一步降低了性能.
参考文献
[1]示例
>>> 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={0, 'p'}) >>> vpolyval([1, 2, 3], x=[0, 1]) array([3, 6]) >>> vpolyval(p=[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)将 self 作为函数调用.