2013-03-06 71 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 2013-03-06 18:51:46

+0

我觉得它非常简单,其中一个numpy的开发人员会把它放在库中。 – Dave 2013-03-06 18:54:13

回答

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回答是一个有益的开端点。

+1

你应该使用numpy,而不是scipy。 'scipy.asarray'只是'numpy.asarray'的别名;使用它会创建对scipy的不必要的依赖。 – 2013-03-06 19:56:46

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