Numpy 编写类装饰器
我有一个类,它有一个名为my_func(x,s,n)的方法。我需要矢量化这个函数。也就是说,我希望能够传递x=[3,4,5,6,7]或任何范围的值,它会给我一个结果。我正在使用numpy,通过查看这里,我找到了一个有效的解决方案。但是,我想让它成为面向对象的。我试过这个:Numpy 编写类装饰器,numpy,python-decorators,Numpy,Python Decorators,我有一个类,它有一个名为my_func(x,s,n)的方法。我需要矢量化这个函数。也就是说,我希望能够传递x=[3,4,5,6,7]或任何范围的值,它会给我一个结果。我正在使用numpy,通过查看这里,我找到了一个有效的解决方案。但是,我想让它成为面向对象的。我试过这个: class Vectorize: """vectorization wrapper that works with instance methods"""
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):
然后我尝试了这个:
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):
我一直收到一个错误,矢量化对象不可调用。还有别的办法吗?谢谢我设法解决了这个问题。但是,既然您已经说过签名会降低性能,我正在考虑另一种解决方案。对于那些好奇的人:
class Vectorize:
"""vectorization decorator that works with instance methods"""
def vectorize(self, otypes=None, signature=None):
# Decorator as an instance method
def decorator(fn):
vectorized = np.vectorize(fn, otypes=otypes, signature=signature)
@wraps(fn)
def wrapper(*args, **kwargs):
return vectorized(*args, **kwargs)
return wrapper
return decorator
class CustomClass:
v = Vectorize()
@v.vectorize(signature=("(),(),(),()->()"))
def my_func(self, k: int, s: float, n: int):
在您在这个项目上投入太多时间之前,请注意性能免责声明。使用
signature
会进一步降低性能。np.vectorize
可以直接用作装饰器,尽管我不知道如何提供otypes
或sig
值<代码>部分可能会有所帮助,但我没有与装饰师合作过多少。它是python代码(或者至少在过去是),但我不知道它在github
存储库中的位置。但我怀疑这纯粹是一个装饰程序代码问题,而不是具体的numpy
。