2013-03-06 49 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