2013-03-06 2 views
3

Есть ли стандартизованный декоратор для применения asarray на аргументах функции?Стандартизованный numpy/scipy декоратор `asarray`

I.e. что-то, где я мог бы написать:

@array_args # this decorator automatically calls asarray on arguments 
def f(x,y): 
    return x/y 

вместо

def f(x,y): 
    (x,y)=(numpy.asarray(x), numpy.asarray(y)) 
    return x/y 

Я только нашел этот discussion, так что я мог бы потянуть декоратора там; но я бы предпочитал использовать версию, которая была интегрирована в numpy.

+1

Я сомневаюсь, что существует - тем более, что писать декоратор самостоятельно довольно просто ... – mgilson

+0

Я понял, что это было так просто, что один из разработчиков numpy поместил бы его в библиотеку. – Dave

ответ

1

Это то, что я закончил с,

import scipy # numpy could work too 
from functools import wraps 
def asarray_strictnumeric(obj): 
    ''' only convert if the result is a numerical array. ''' 
    tmp=scipy.asarray(obj) 
    if tmp.dtype.kind in 'iufc': 
     return tmp 
    else: 
     return obj 

def array_args(f): 
    ''' Decorator: 
     - converts numerical positional arguments to arrays, 
     - leaves non-numerical positional arguments alone, 
     - leaves all keywords alone. 
    ''' 
    @wraps(f) 
    def wrapper(*args, **kwds): 
     args=[asarray_strictnumeric(x) for x in args] 
     return f(*args, **kwds) 
    return wrapper 

но @promanow s ответ был полезным отправным точка.

+1

Вы должны использовать numpy, а не scipy. 'scipy.asarray' - просто псевдоним для' numpy.asarray'; использование его создает ненужную зависимость от scipy. –

4

AFAIK не существует, но это достаточно просто написать один:

from functools import wraps 


def array_args(func): 
    @wraps(func) 
    def wrapper(*args): 
     arrays = map(np.asarray, args) 
     return func(*arrays) 

    return wrapper