2015-06-19 260 views
2

我有兩個大的(432 * 136 * 136 * 46)'numpy.ndarray'H1和H2,其中包含對應於兩個模擬的高度值。當H1和H2具有相同的高度時,我想用1生成一個數組,當它們不具有相同的高度時,則爲0。然後,我想知道我選擇了多少個元素,所以我想計算這個矩陣元素的總和。這裏是我的代碼:Numpy sum函數返回1.67772e + 07

H1=np.concatenate([np.around(files1[i].hrtm()[:,0:45,:,:]/h) for i in range(0,files1.__len__())]) 
H2=np.concatenate([np.around(files2[i].hrtm()[:,0:45,:,:]/h) for i in range(0,files2.__len__())]) 

diff=np.absolute(H1-H2) 
diff[diff==0.]=np.float64(-1.) 
diff[diff!=-1]=np.float64(0.) 
diff=diff*diff 

print np.sum(diff) 

這裏是我的輸出,這是永遠不變的,不依賴於數據:

1.67772e+07 

經過一番研究,我讀了它與最大浮動的大小。我嘗試了幾種格式,用int,float,np.float32或者什麼都替換np.float64,並且它們都給出了相同的結果。

你知道如何才能擁有真實的號碼嗎?

+0

它與單精度浮點數的**精度**相關:在值2^24之上,加1不會產生任何影響,因爲它是絕對的rbed。 –

+1

@rth:這是一個奇怪的斷言。 'diff == 0.'將給出一個數組,其中包含與True和False在其他地方相對應的位置。它將按照OP的意圖工作。 –

+0

@MarkDickinson請注意,「如果'diff'是一個浮點數組」在我的評論。我錯過了它被轉換爲帶有'np.around'的整數的事實。否則,你最終可能會遇到四捨五入的問題,比如檢查'2.2 * 3.0 == 6.6',它將在python中計算爲False。 – rth

回答

2

diff -array的類型是H1H2的類型。由於您只增加了許多1是你可以轉換diffbool

print diff.astype(bool).sum() 

或更簡單

print (H1 == H2).sum() 

但由於浮點值不準確的,人們可能會測試非常小的差異:

print (abs(H1 - H2) < 1e-30).sum() 
+2

'(H1 == H2).sum()'? –

+0

這很好,非常感謝,而且這些解決方案更加優雅。 –

+1

請注意,H1和H2的值已經四捨五入到最接近的整數,所以使用容差在這裏沒有任何實現。 (如果這些是以英尺爲單位的高度,那麼'1e-30'會變得太小而無用:比較基本上是相等的。) –