当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python numpy vectorize用法及代码示例


本文简要介绍 python 语言中 numpy.vectorize 的用法。

用法:

class  numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

广义函数类。

定义一个向量化函数,它将对象的嵌套序列或 numpy 数组作为输入并返回单个 numpy 数组或 numpy 数组的元组。向量化函数在输入数组的连续元组上评估 pyfunc,就像 python map 函数一样,除了它使用 numpy 的广播规则。

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

参数

pyfunc 可调用的

python 函数或方法。

otypes str 或 dtypes 列表,可选

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

doc str,可选

函数的文档字符串。如果没有,文档字符串将是 pyfunc.__doc__

excluded 设置,可选

表示函数不会被矢量化的位置或关键字参数的字符串或整数集。这些将直接传递给 pyfunc 未经修改。

cache 布尔型,可选

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

signature 字符串,可选

广义通用函数签名,例如,(m,n),(n)->(m) 用于矢量化matrix-vector 乘法。如果提供,pyfunc 将被调用(并期望返回)具有由相应核心尺寸的大小给出的形状的数组。默认情况下,pyfunc 假定将标量作为输入和输出。

返回

vectorized 可调用的

向量化函数。

注意

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

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

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

参考

1

通用通用函数 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'>

排除在外参数可用于防止对某些参数进行向量化。这对于固定长度的类似数组的参数很有用,例如多项式的系数,如下所示numpy.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.]])

相关用法


注:本文由纯净天空筛选整理自numpy.org大神的英文原创作品 numpy.vectorize。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。