@guvectorize 装饰器
vectorize()允许您编写一次只能处理一个元素的UFUNC,但guvectorize()装饰器将这一概念更进一步,允许您编写可以处理任意数量的输入数组元素的UFUNC,并获取和返回不同维度的数组。
与vectorize()函数相反,guvectorize()函数不返回其结果值:它们将其作为数组参数,必须由函数填充。这是因为数组实际上是由NumPy的分派机制分配的,该机制调用NUMA生成的代码。
与vectorize()decorator类似,guvectorize()也有两种操作模式:积极编译和惰性编译。
一个简单的例子:
@guvectorize([(int64[:], int64, int64[:])], '(n),()->(n)')
def g(x, y, res):
for i in range(x.shape[0]):
res[i] = x[i] + y
# 不写return res
>>> a = np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> g(a,100) # 调用的时候参数只有x,y,没有res
array([100, 101, 102, 103, 104], dtype=int64)
函数签名中“'(n),()->(n)'” 表示输入参数为一个一维数组和一个标量,返回一个一维数组。
可以自动维数扩展,x参数可传入二维数组,y参数可以传入一维数组,根据形状自动匹配。
>>>a = np.arange(6).reshape(2, 3)
>>>a
array([[0, 1, 2],
[3, 4, 5]])
>>>g(a, np.array([10, 20]))
array([[10, 11, 12], # + 10
[23, 24, 25]], dtype=int64) # + 20
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!