原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html
校对:(虚位以待)
numpy.
vectorize
(pyfunc, otypes='', doc=None, excluded=None, cache=False)[source]广义函数类。
定义一个矢量化函数,它将嵌套的对象序列或numpy数组作为输入,并返回一个numpy数组作为输出。向量化函数对输入数组的连续元组评价pyfunc就像python映射函数,只不过它使用numpy的广播规则。
向量化的输出的数据类型通过调用具有输入的第一个元素的函数来确定。这可以通过指定otypes参数来避免。
参数: | pyfunc:callable
otypes:str或dtypes列表,可选
doc:str,可选
排除:set,可选
缓存:bool,可选
|
---|---|
返回: | 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) |
在args和kwargs中不在排除中返回pyfunc广播(向量化)的结果的数组。 |