2012-09-21 12 views
4

我正在學習Python和numpy,並且對鴨打字的想法很陌生。我正在編寫函數,其中/某人應該傳遞一個numpy數組。試圖接受鴨子打字,我寫我的代碼使用numpy.arraycopy=ndmin=選項將array_likes或1d/0d數組轉換成我需要的形狀。具體來說,我使用ndmin=選項的情況下,我可以接受(p,p)陣列或標量;標量可以被編碼爲int(1,)數組,數組(1,1)[1]列表等..numpy.array()拋出的異常(對於最初的可怕標題抱歉)

所以要照顧這個,我使用類似S = numpy.array(S,copy=False,ndmin=2)獲取數組(如果可能)與正確的ndim,然後測試我需要的形狀。我知道我應該將它嵌入Try-Except塊中,但是找不到關於可能拋出什麼樣的異常numpy.array()的任何文檔。因此,我目前只是有這個:

# duck covariance matrix into a 2d matrix 
try: 
    S = numpy.array(S, ndmin = 2, copy=False) 
except Exception as e: 
    raise e 

什麼樣的特殊例外(s)我應該嘗試在這裏抓住?謝謝。

+1

只是爲了確保您清楚這一點:1'ndmin'是最小尺寸不是精確的尺寸,結果可能是3D 2.爲什麼在所有的一'嘗試:...'因爲你傳播異常無論如何? (順便說一句,它的ValueError) – seberg

+0

謝謝。我迫使ndmin至少2,然後檢查S.ndim = 2,如果不是,則提出我自己的ValueError。 –

+0

Re。引發錯誤,我會用自己的消息來提出錯誤,比如'raise ValueError(「輸入應該是一個大小爲(p,p)的數組:%s」%EntComp .__ doc __)' –

回答

3

將您的函數記錄爲接受一個array_like對象,並將異常處理留給調用者。

numpy.array()是非常寬容的功能,它會轉換成數組幾乎所有的東西。

+0

Thanks @JF如果numpy真的是寬容的,我會保留通用提升。 –

+1

@ Dr.Drew:to be明確:我建議完全刪除numpy.array()周圍的try/except塊。 – jfs

+0

啊,好的。真?你甚至不會捕捉並重新評估相同的錯誤? –

0

嘗試使用np.asarray將輸入轉換爲數組。如果輸入已經是Numpy數組,則保證不會複製任何內容。如果您希望收到array的子類,請使用np.asanyarray

請注意,如果輸入是1維或2維的,很多Numpy界面並不關心 - 例如,np.dot可以同時處理1維和2維輸入。這可能是最好的方式 - 這樣,像標量乘法只是工作

+1

'np.asarray'很好,但它實際上只是'copy = False'的'np.array'。 – seberg

+0

謝謝你的澄清!我(顯然)不知道這一點。然而,就哪一個用於什麼目的而言,似乎通常在輸入參數上使用'asarray'而不是'array(...,copy = False)'。 (我猜這是因爲'asarray'稍微簡單一些)。 – nneonneo

+0

@mneonneo:我知道numpy _often_並不在意(但是在numpy.trace()或numpy.linalg.det()方法上,它不是2d數組。對於某些_my_用法,我必須小心。更喜歡使用'array(...,copy = False)',因爲它與'asarray()'相同,它爲我的代碼添加了隱式文檔,並且顯示我確切地知道我期望發生什麼 –