2016-10-25 83 views
0

我試圖對numpy類型執行有效性檢查 - 具體地說,如果np.longdouble是80位擴展精度浮點型並獲取其原始字節大小(使用填充)。獲取有關numpy dtype的信息

通過dtype docs可以得到一大堆來自屬性的信息。但是,無論我檢查的屬性,我得到

In [23]: np.longdouble.nbytes 
Out[23]: <attribute 'nbytes' of 'numpy.generic' objects> 

而不是數字。

我可以從np.finfo(np.longdouble)得到一大堆信息,但它不包含字節大小。

當然,我可以創建一個這種類型的數組,並計算大小或其他...但是這真的有必要獲得不綁定到特定實例的信息嗎?

+1

這會幫助嗎? - http://stackoverflow.com/questions/16972501/numpy-size-of-data-type – Divakar

回答

2

根據Numpy size of data type,需要np.dtype(<type>)才能真正得到真實的屬性值。奇怪的!

這裏(使用dump模塊):

In [27]: dump(np.dtype(np.longdouble)) 
alignment : 8 
base : float64 
byteorder : = 
char : g 
descr : [('', '<f8')] 
fields : None 
flags : 0 
hasobject : False 
isalignedstruct : False 
isbuiltin : 1 
isnative : True 
itemsize : 8 
kind : f 
metadata : None 
name : float64 
names : None 
num : 13 
shape :() 
str : <f8 
subdtype : None 
type : <type 'numpy.float64'> 

該輸出是從上win32平臺的Python 2.7和,predictablynp.longdouble是雙而非擴展精度這裏。

爲了便於比較,這裏有來自86 CentOS 6的輸出它的擴展:

alignment : 4 
base : float96 
byteorder : = 
char : g 
descr : [('', '<f12')] 
fields : None 
flags : 0 
hasobject : False 
isbuiltin : 1 
isnative : True 
itemsize : 12 
kind : f 
metadata : None 
name : float96 
names : None 
num : 13 
shape :() 
str : <f12 
subdtype : None 
type : <type 'numpy.float96'> 
+0

你正在運行什麼版本? OS?我的Linux 3.5+上的項目大小爲12。 – hpaulj

+0

在win32上@hpaulj 2.7。輸出僅僅是一個例子 - 我不想在各種平臺上混淆所有可能輸出的答案。我已經添加了一個註釋來達到這個效果。畢竟,問題只是獲取值而不是驗證'np.longdouble'爲80位的所有方面。 –

2

去實例路線:

In [1586]: np.array(1,np.longdouble) 
Out[1586]: array(1.0, dtype=float96) 
In [1587]: np.longdouble(1).nbytes 
Out[1587]: 12 

In [1588]: np.dtype(np.longdouble) 
Out[1588]: dtype('float96') 

默認的浮動是float64

nbytes是實例的屬性,而不是類的屬性。這種區別在Python中很常見。

如果讓我從它dtype對象:

In [1592]: dt=np.dtype(np.longdouble) 
In [1593]: dt 
Out[1593]: dtype('float96') 
In [1594]: dt.descr 
Out[1594]: [('', '<f12')] 
In [1595]: dt.itemsize 
Out[1595]: 12 

np.typeDict地圖代碼的類型。類型名稱通常表示大小。

In [1600]: np.typeDict['longdouble'] 
Out[1600]: numpy.float96 

===================

finfo開始與np.dtype(dtype)。所以dt.itemsize是獲得這種類型字節大小的正確方法。

由於dtypes有很多同義詞,因此使用像np.dtype這樣的「中央結算所」是有意義的。而且對編譯器有一定的依賴性,所以有些屬性必須在運行時導出,而不是在某些python類定義中進行硬編碼。

+0

注意:'typeDict'沒有記錄。 –

+1

'github'搜索不顯示任何文檔參考。但它是在'numpy/numpy/core/numerictypes.py'中創建的 – hpaulj