2013-10-31 50 views
1

像以下。如何保持numpy的陣列的精度

>>>a=numpy.array([-97.173125220360362], dtype=double) 
>>>b=[] 
>>>b.append(a) 
>>>b 
-97.173125220360362 

但是,如果我將值賦給List直接。它會丟失最後一個數字,如下所示:

>>>b=[-97.173125220360362] 
>>>b 
-97.17312522036036 
>>>b=[] 
>>>b.append(-97.173125220360362) 
>>>b 
-97.17312522036036 

而我發現我無法更改最後一個數字。像下面

>>>b=[-97.173125220360364]  
>>>b  
-97.17312522036036  
>>>numpy.double(b)  
-97.173125220360362 not -97.173125220360364 

PS
我需要很多雙號從numpy.array保存到一個XML文件。通過閱讀XML文件,我發現我失去了所有最後的numpy。
例如
如果我將-97.17312522036036保存到XML中。並從XML讀取值作爲字符串。然後將該字符串轉換爲雙精度值。這將圍繞我的價值

回答

3

你在這裏看到的實際上是在__repr____str__ numpy浮點數據類型和內置浮點數據類型的區別。

不一致。

>>> repr(a[0]) 
'-97.173125220360362' 
>>> repr(float(a[0])) 
'-97.17312522036036' 

一致。

>>> '%0.18f'%float(a[0]) 
'-97.173125220360361709' 
>>> '%0.18f'%(a[0]) 
'-97.173125220360361709' 

無論哪種方式,它們在內存中的表示都是相同的。額外的「精度」你是在一個結果看確實只是噪音:

>>> struct.unpack('>l', struct.pack('>f', float(-97.17312522036036))) 
(-1027450716,) 
>>> struct.unpack('>l', struct.pack('>f', float(-97.173125220360362))) 
(-1027450716,) 
>>> struct.unpack('>l', struct.pack('>f', a[0])) 
(-1027450716,) 
>>> struct.unpack('>l', struct.pack('>f', float(a[0]))) 
(-1027450716,) 
1

它是完全一樣的號碼,它只是發生在它的numpy.double,而不是float以不同的格式:

>>> x = -97.173125220360362 
>>> x 
-97.17312522036036 
>>> np.double(x) 
-97.173125220360362 
>>> np.double(x) == x 
True 
+0

還,'repr(np.double(' - 97.17312522036036'))=='-97.173125220360362'' –

+0

無論你給的最後一個號碼是什麼。它會是'2'。例如x = -97.17312522036036n,np.double(x)的回顯是-97.173125220360362 – Samuel