【发布时间】:2021-01-28 08:38:42
【问题描述】:
我有一个类,它有一个名为 my_func(x,s,n) 的方法。我需要对这个函数进行矢量化。也就是说,我希望能够通过 x = [3,4,5,6,7] 或任何范围的值,它会给我一个结果。我正在使用 numpy 并通过这里查看,我设法找到了一个可行的解决方案。但是,我想让它面向对象。我试过这个:
class Vectorize:
"""vectorization wrapper that works with instance methods"""
def __init__(self, otypes=None, signature=None):
self.otypes = otypes
self.sig = signature
# Decorator as an instance method
def decorator(self, fn):
vectorized = np.vectorize(fn, otypes=self.otypes, signature=self.sig)
@wraps(fn)
def wrapper(*args, **kwargs):
return vectorized(*args, **kwargs)
return wrapper
然后我尝试了这个:
@Vectorize(signature=("(),(),(),()->()"))
def my_func(self, k: int, s: float, n: int):
我不断收到错误消息,Vectorize 对象不可调用。有没有其他方法可以做到这一点?谢谢
【问题讨论】:
-
在你在这个项目上投入太多时间之前,请注意性能免责声明。使用
signature会进一步降低性能。 -
np.vectorize可以直接用作装饰器,尽管我不知道如何提供otypes或sig值。partial可能会有所帮助,但我与装饰者的合作不多。它是 python 代码(或者至少是过去的代码),但我不知道它在github存储库中的位置。但我怀疑这纯粹是装饰器代码问题,而不是numpy特定的。