gpt4 book ai didi

python - Numpy vectorize 作为带参数的装饰器

转载 作者:太空狗 更新时间:2023-10-29 18:29:04 27 4
gpt4 key购买 nike

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

 @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.int 数组。 float ,与文档中的内容相反????

现在,我想强制输出 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 状态?

最佳答案

对我有用:

>>> 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 , 默认情况下,通过评估函数的第一个参数获取其输出类型:

The data type of the output of vectorized is determined by calling the function with the first element of the input.

所以,你应该传递 float并返回 float如果你想确保它推断出 float作为输出数据类型(例如使用 else 0.0 并传递 y = 8.0 )。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com