NumPy参考 >例行程序 >Functional programming > numpy.vectorize
numpy.
vectorize
(pyfunc,otypes =无,DOC =无,排除=无,缓存=假,签名=无)[源] ¶广义函数类。
定义一个矢量化函数,该函数将嵌套的对象序列或numpy数组作为输入,并返回单个numpy数组或numpy数组的元组。像python map函数一样,矢量化函数在输入数组的连续元组上评估pyfunc,除了它使用numpy的广播规则。
通过使用输入的第一个元素调用函数来确定矢量化输出的数据类型。通过指定otypes参数可以避免这种情况。
python函数或方法。
输出数据类型。必须将其指定为一串类型代码字符或一列数据类型说明符。每个输出应有一个数据类型说明符。
该函数的文档字符串。如果为None,则文档字符串将为
pyfunc.__doc__
。
一组字符串或整数,表示位置或关键字参数,对其不会对其进行向量化。这些将直接传递给未经修改的pyfunc。
1.7.0版中的新功能。
如果为True,则在未提供otypes的情况下,缓存确定输出数量的第一个函数调用。
1.7.0版中的新功能。
通用通用函数签名,例如,(m,n),(n)->(m)
用于矢量化矩阵-矢量乘法。如果提供的话,pyfunc
将被调用(并期望返回)数组,其形状由相应核心尺寸的大小确定。默认情况下,pyfunc
假定将标量作为输入和输出。
1.12.0版中的新功能。
向量化功能。
也可以看看
frompyfunc
接受任意Python函数并返回ufunc
笔记
vectorize
提供此功能主要是为了方便,而不是为了提高性能。该实现实质上是一个for循环。
如果未指定otypes,则将使用对带有第一个参数的函数的调用来确定输出数量。如果cache为True,则此调用的结果将被缓存,以防止两次调用该函数。但是,要实现缓存,必须包装原始函数,这会减慢后续调用的速度,因此仅在函数昂贵时才这样做。
新的关键字参数接口和排除的参数支持进一步降低了性能。
参考文献
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'>
在排除参数可以用来防止向量化对某些参数。这对于固定长度的类似数组的参数(例如多项式的系数)很有用,例如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])
的签名参数允许向量化上的固定长度的非标量阵列作用的功能。例如,可以将其用于皮尔逊相关系数及其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.]])
方法
|
用的结果返回阵列pyfunc广播(矢量)超过ARGS和kwargs不排除。 |