14

我试图矢量化(同意,不是最有效的方法,但我的问题是关于装饰器的使用)以下函数

 @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 后,输出正常。

任何人都可以解释为什么即使第一个参数 x 在这里是 aray of的结果diff_if_bigger被转换成一个数组,与文档中的内容相反????np.intnp.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-如何清理 IPython 状态?

4

1 回答 1

16

为我工作:

>>> 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是通过使用输入的第一个元素调用函数来确定的。

因此,如果您想确保它推断为输出 dtype(例如 use和 pass ) ,您应该通过float并返回。floatfloatelse 0.0y = 8.0

于 2013-02-20T18:02:59.553 回答