标准化的numpy / scipy`asarray`装饰

时间:2013-03-06 18:50:20

标签: python arrays numpy decorator

是否有标准化的装饰器用于在函数参数上应用asarray

即。我可以写的东西:

@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

的版本

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的答案是一个有用的起点。