2013-02-01 98 views
0

我想編寫接受數字參數x的函數,這些函數可以是未定義的,比如x = 1或大小,列表,元組或ndarray,如x = np.array([1,2])。有沒有一種好的方法來編寫處理這兩種情況的代碼?如何處理可以調整大小或未調整大小的Python對象

作爲具體的例子,假設目標是廣播x成(預定形狀xshape的)的陣列如果x只是一個數字,並且如果x是用錯誤的形狀的陣列,以返回一個錯誤。

import numpy as np 
import sys 

if np.shape(np.atleast_1d(x)) == (1,): 
    x = np.ones(xshape) * x 
elif np.shape(x) != xshape: 
    sys.exit("wrong shape for x") 

上面的代碼似乎工作,除了嵌套困難x = [[2]]。它似乎也違背了一些推薦的做法,如try/except。任何建議感激。

+2

請注意,'<>'運算符已被棄用,並且在3.x中消失了 - 使用'!='代替。類型(x) – delnan

+0

不夠? –

+0

@Radio我見過'type(x)',因爲有太多的情況,並且違背了所謂的「鴨子打字」。如果未定義的數字是「float」,「int」等,並且大小集合是「ndarray」,「list」或「tuple」,我似乎可以工作。 –

回答

0

做到這一點的一種方法是推遲numpy,它可以處理所有各種情況並隱藏你的複雜性。例如:

>>> import numpy as np 
>>> xshape = (2,) 
>>> np.ones(xshape) * 1 
array([ 1., 1.]) 
>>> np.ones(xshape) * [9, 8] 
array([ 9., 8.]) 
>>> np.ones(xshape) * [[9, 8]] 
array([[ 9., 8.]]) 
>>> # Wrong shape 
>>> np.ones(xshape) * [[9, 8, 7]] 
ValueError        Traceback (most recent call last) 
<ipython-input-28-dd8a3b87c22c> in <module>() 
----> 1 np.ones(xshape) * [[9, 8, 7]] 

ValueError: operands could not be broadcast together with shapes (2) (1,3) 

另一個相關的方法是在函數/腳本的開頭使用x = np.aarray(x)。如果x已經是一個數組,則沒有任何反應,但如果x是標量或序列,則會創建一個適當形狀的數組,然後您可以編寫代碼的其餘部分,因爲知道x是一個數組(如果x無法轉換數組中會出現錯誤)。

相關問題