numpy.vectorize #
- 类 numpy.矢量化(pyfunc = np._NoValue, otypes = None, doc = None, excepted = None, cache = False, signature = None)[来源] #
返回一个行为类似于 pyfunc 的对象,但采用数组作为输入。
定义一个向量化函数,它将对象或 numpy 数组的嵌套序列作为输入,并返回单个 numpy 数组或 numpy 数组的元组。向量化函数在输入数组的连续元组上评估pyfunc,就像 python map 函数一样,只不过它使用 numpy 的广播规则。
矢量化输出的数据类型是通过使用输入的第一个元素调用函数来确定的。可以通过指定otypes参数来避免这种情况。
- 参数:
- pyfunc可调用,可选
python 函数或方法。可以省略以生成带有关键字参数的装饰器。
- otypes str 或 dtypes 列表,可选
输出数据类型。它必须指定为类型代码字符的字符串或数据类型说明符的列表。每个输出应该有一个数据类型说明符。
- 文档str,可选
该函数的文档字符串。如果没有,文档字符串将是
pyfunc.__doc__
.- 排除集,可选
表示函数不会被矢量化的位置参数或关键字参数的字符串或整数集。这些将不加修改地直接传递给pyfunc。
1.7.0 版本中的新增内容。
- 缓存布尔值,可选
如果为True ,则在未提供otypes的情况下缓存确定输出数量的第一个函数调用。
1.7.0 版本中的新增内容。
- 签名字符串,可选
广义通用函数签名,例如
(m,n),(n)->(m)
用于矢量化矩阵-矢量乘法。如果提供,pyfunc
将使用(并期望返回)数组进行调用,其形状由相应核心维度的大小给出。默认情况下,pyfunc
假定将标量作为输入和输出。1.12.0 版本中的新增内容。
- 返回:
- 可调用的
pyfunc
如果提供了向量化函数,否则提供装饰器。
也可以看看
frompyfunc
接受任意 Python 函数并返回 ufunc
笔记
提供该
vectorize
功能主要是为了方便,而不是为了性能。该实现本质上是一个 for 循环。如果未指定otypes,则使用第一个参数调用函数将用于确定输出数量。如果cache为True,则该调用的结果将被缓存,以防止调用该函数两次。但是,要实现缓存,必须包装原始函数,这会减慢后续调用的速度,因此仅当您的函数昂贵时才这样做。
新的关键字参数接口和排除的参数支持进一步降低了性能。
参考
[ 1 ]例子
>>> 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'>
排除的参数可用于防止对某些参数进行向量化。这对于固定长度的类似数组的参数很有用,例如多项式的系数,如下所示
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])
签名参数允许对作用于固定长度的非标量数组的函数进行向量化。例如,您可以使用它来矢量化计算 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 身份(x): ...返回 x ... >>>身份([0, 1, 2]) 数组([0, 1, 2]) >>>@np.vectorize(otypes =[float]) ...def as_float(x): ...返回 x ... >>>as_float([0, 1, 2]) array([0., 1., 2.])
方法
__call__
(*args, **kwargs)将 self 称为函数。