numpy.vectorize

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

class numpy.vectorize(pyfunc, otypes='', doc=None, excluded=None, cache=False)[source]

广义函数类。

定义一个矢量化函数,它将嵌套的对象序列或numpy数组作为输入,并返回一个numpy数组作为输出。向量化函数对输入数组的连续元组评价pyfunc就像python映射函数,只不过它使用numpy的广播规则。

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

参数:

pyfunc:callable

python函数或方法。

otypes:str或dtypes列表,可选

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

doc:str,可选

函数的docstring。如果,docstring将是pyfunc.__doc__

排除:set,可选

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

版本1.7.0中的新功能。

缓存:bool,可选

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

版本1.7.0中的新功能。

返回:

vectorized:callable

矢量化函数。

笔记

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

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

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

例子

>>> 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])

除非指定,否则docstring取自输入函数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])
<type 'numpy.int32'>
>>> vfunc = np.vectorize(myfunc, otypes=[np.float])
>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])
<type '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])

方法

__call__(\ * args,\ * \ * kwargs) argskwargs中不在排除中返回pyfunc广播(向量化)的结果的数组。