2012-09-21 62 views
2

我已經看到一些工作的Python函數通常接收(n,2)形狀的numpy ndarray作爲參數,但也可以「自動」接收(2,n)甚至len (2)序列(元組或列表)。Python函數接受numpy ndarray或序列作爲參數

pythonically是如何實現的?是否有一個統一的良好實踐來檢查和處理這些案例(例如,numpy和scipy模塊中的函數),還是每個開發人員實現他認爲最好的?

我只是想避免ifs/elifs鏈(可能嵌套)鏈,以防萬一有一個衆所周知的更好的方法。

感謝您的任何幫助。

回答

6

可以使用numpy.asarray功能,任何序列式輸入轉換爲數組:

>>> import numpy 
>>> numpy.asarray([1,2,3]) 
array([1, 2, 3]) 
>>> numpy.asarray(numpy.array([2,3])) 
array([2, 3]) 
>>> numpy.asarray(1) 
array(1) 
>>> numpy.asarray((2,3)) 
array([2, 3]) 
>>> numpy.asarray({1:3,2:4}) 
array({1: 3, 2: 4}, dtype=object) 

需要注意的是,如文檔說不進行復制,如果輸入已經是一個ndarray這一點很重要。這是非常好的,因爲你可以傳入一個現有的數組,它只是返回相同的數組。

將其轉換爲numpy數組後,只需檢查長度是否爲需求。喜歡的東西:

>>> def f(x): 
... x = numpy.asarray(x) 
... if len(x) != 2: 
...  raise Exception("invalid argument") 
... 
>>> f([1,2]) 
>>> f([1,2,3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in f 
Exception: invalid argument 

更新: 既然你這麼問,這裏有一個「神奇」的功能,將除外* ARGS作爲數組也:

>>> def f(*args): 
... args = numpy.asarray(args[0]) if len(args) == 1 else numpy.asarray(args) 
... return args 
... 
>>> f(7,3,5) 
array([7, 3, 5]) 
>>> f([1,2,3]) 
array([1, 2, 3]) 
>>> f((2,3,4)) 
array([2, 3, 4]) 
>>> f(numpy.array([1,2,3])) 
array([1, 2, 3]) 
+0

會不會有它考慮的方式一個個體變量列表(存儲在* args中的列表)也是一個數組?所以我可以調用'function(x,y)','function([x,y])','function(numpy.array([[x],[y]]))'...?如果len(args)== 1 else numpy.asarray(args)'' – heltonbiker

+0

* ARGS – jterrace

+0

更新的問題帶有「def f(* args)''並且使用''numpy.asarray(args [0])' – jterrace

相關問題