#numpy #python-decorators
#numpy #python-декораторы
Вопрос:
у меня есть класс, в котором есть метод с именем 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):
Я продолжаю получать сообщение об ошибке, объект векторизации не вызывается. Есть ли какой-либо другой способ сделать это? Спасибо
Комментарии:
1. Прежде чем вкладывать слишком много времени в этот проект, обратите внимание на отказ от ответственности за производительность. Использование
signature
еще больше снижает производительность.2.
np.vectorize
может использоваться непосредственно в качестве декоратора, хотя я не знаю, как указать значенияotypes
orsig
.partial
может помочь, но я мало работал с декораторами. Это код python (или, по крайней мере, был в прошлом), но я не знаю, где он находится вgithub
репозитории. Но я подозреваю, что это чисто проблема кода декоратора, а неnumpy
конкретная.
Ответ №1:
Мне удалось исправить эту проблему. Но теперь, когда вы сказали, что подпись снижает производительность, я рассматриваю альтернативное решение. Для тех, кому интересно:
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):