我试图向量化(同意,这不是最有效的方法,但我的问题在于装饰器的使用)以下功能

 @np.vectorize
 def diff_if_bigger(x, y):
     return y - x if y > x else 0

 x = np.array([5.6, 7.0])
 y = 8

 diff_if_bigger(x, y)
 # outputs array([2, 1]) which is not what I want

编辑:重启ipython后,输出正常。
有人能解释为什么diff_if_bigger的结果会变成一个np.int的数组吗?即使第一个参数x在这里是一个np.float的数组,与文档中的内容相反?????
现在,我想强制一个浮点输出,所以我这样做了
 @np.vectorize('np.float')
 def diff_if_bigger(x, y):
     return y - x if y > x else 0
 # Error !!
 # TypeError: Object is not callable.

 @np.vectorize(otypes='np.float')
 def diff_if_bigger(x, y):
     return y - x if y > x else 0
 # Again error !!
 # TypeError: __init__() takes at least 2 arguments (2 given)


 @np.vectorize(otypes=[np.float])
 def diff_if_bigger(x, y):
     return y - x if y > x else 0
 # Still an error !!
 # TypeError: __init__() takes at least 2 arguments (2 given)

顺便说一下,即使是这个
 vec_diff = np.vectorize(diff_if_bigger, otypes=[np.float])

不起作用!!!!怎么了??
编辑:事实上,在我重新启动ipython之后,后者起作用了。
所以在我之前的两次编辑之后,我的问题现在是双重的:
1-如何使用np.vectorize作为带参数的修饰器?
2-我怎样才能清洁伊普敦州?

最佳答案

为我工作:

>>> import numpy as np
>>> @np.vectorize
... def diff_if_bigger(x, y):
...      return y - x if y > x else 0
...
>>> diff_if_bigger(np.array([5.6,7.0]), 8)
array([ 2.4,  1. ])

注意,除了最简单的情况外,np.vectorize并不是真正意义上的修饰器。如果需要指定一个显式的otype,请使用通常的形式new_func = np.vectorize(old_func, otypes=...)或使用functools.partial来获取装饰器。
也请注意,默认情况下,通过对第一个参数上的函数进行计算来获取其输出类型:
np.vectorize输出的数据类型是通过使用输入的第一个元素调用函数来确定的。
因此,如果要确保将vectorized推断为输出数据类型(例如,使用float和passfloat),则应通过并返回float

关于python - Numpy vectorize作为带参数的装饰器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14986697/

10-10 03:08