2013-12-10 61 views
3

我有一個基於NumPy的庫,有一些類會重載算術運算。由於大量的錯誤檢查,內部結構有點毛,但是我已經遇到了一個嚴重的問題,就是我正在做這件事。確定NumPy類型的擴展轉換

該庫背後的思想是讓程序員以最少的語法和精力使用它,非常簡單直觀。因此,我希望能夠輕鬆地組合不同數據類型的數組,並將較窄的數據類型轉換爲更大的數據類型。

舉例來說,如果我有兩個陣列,一個與D型float64和其他與D型complex128,一起加入它們時,我想轉換float64complex128,但如果它是float64complex192,我要轉換爲相反。但是,如果它是float64complex64的組合,兩者之間不存在有效轉換,但不會損失float64的精度,因此我想將它們都轉換爲complex128

我立即看到了問題,我將不得不尋找每種類型的組合,並確定它們最窄的常見擴展類型(想想最小公倍數),如果我想讓我的庫充分健壯。 I 不要想要將所有內容都轉換爲儘可能最寬的類型,因爲這會非常快速地變成內存效率低下的問題,而且我經常會將非常大的數組存儲在內存中。

是否有一種很好的方法來確定兩個NumPy類型之間最窄的常見擴展類型?

+0

可能重複[在numpy中獲取結果數組的dtype](http://stackoverflow.com/questions/7285612/getting-the-dtype-of-a-result-array-in-numpy) – askewchan

回答

5

@amaurea看法是正確的;實際上,這個功能已經存在於numpy中。看看和promote_types

+0

謝謝,這個解決方案只需要修改我目前的代碼來修復這個bug,這正是我需要的,絕對是這樣做的慣用方式。 – bheklilr

2

我覺得numpy已經在內部做了這個,那麼問問numpy怎麼樣?

(zeros([],dtype=float64)+zeros([],dtype=complex64)).dtype 
=> dtype('complex128') 

(zeros([],dtype=float32)+zeros([],dtype=complex64)).dtype 
=> dtype('complex64') 

你可以概括成一個函數這樣的:

def common_dtype(dtypes): 
    return np.sum([np.zeros([],dtype=d) for d in dtypes]).dtype 
+0

I像'common_dtype'函數,這正是我正在尋找 – bheklilr

+3

看看http://docs.scipy.org/doc/numpy/reference/generated/numpy.result_type.html和 http:// docs .scipy.org/doc/numpy/reference/generated/numpy.promote_types.html –

+0

@WarrenWeckesser這看起來是首選的方法。儘管amaurea的解決方案可行,但我不得不承認這兩個功能更適合。如果您將其作爲答案發布,我會接受它。 – bheklilr