4

是否有用于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

我只找到了这个讨论,所以我可以把装饰器拉到那里;但我更喜欢使用已集成到numpy.

4

2 回答 2

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
于 2013-03-06T19:17:39.750 回答
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 的回答是一个有用的起点。

于 2013-03-06T19:49:52.770 回答