2015-04-05 30 views
0

我試圖用python計算兩個完全重疊圖像的協方差矩陣。對於相同的代碼是:協方差矩陣Python - 省略-9999數值

stacked = np.vstack((image1.ravel(),image2.ravel())) 
np.cov(stacked) 
  • 與使用這種方法的問題是,有時圖像可能包含一個NoData值等-9999表示該像素值不存在。在這種情況下,np.cov仍然認爲引起圖像平均值的值急劇變化,從而給出錯誤的協方差輸出。

  • 如果我嘗試去除NoData,則會出現維度問題,其中兩個圖像都沒有相同的維度,因此無法計算協方差矩陣。

  • 人工計算會耗費

是否有克服的無數據的問題,並正確計算的協方差矩陣的值高的時間?

回答

0

你最好的選擇是使用帶有numpy的的蒙面陣列,其中之一就是計算的協方差矩陣的方法時掩蓋物品存在:

>>> import numpy as np 
>>> mask_value = -9999 
>>> a = np.array([1, 2, mask_value, 4]) 
>>> b = np.array([1, mask_value, 3, 4]) 
>>> c = np.vstack((a,b)) 
>>> 
>>> masked_a, masked_b, masked_c = [np.ma.array(x, mask=x==mask_value) for x in (a,b,c)] # note: testing for equality is a bad idea if you're working with floats. I'm not, these are integers, so it's okay. 
>>> 
>>> result = np.ma.cov(masked_c) 
>>> result 
masked_array(data = 
[[2.333333333333333 4.444444444444445] 
[4.444444444444445 2.333333333333333]], 
      mask = 
[[False False] 
[False False]], 
     fill_value = 1e+20) 

>>> np.cov([1,2,4]) # autocovariance when just one element is masked is the same as the previous result[0,0] 
array(2.333333333333333) 

結果取決於你如何在不同的撥打np.ma.cov

>>> np.ma.cov(masked_a, masked_b) 
masked_array(data = 
[[4.5 4.5] 
[4.5 4.5]], 
      mask = 
[[False False] 
[False False]], 
     fill_value = 1e+20) 

>>> np.cov([1,4]) # result of the autocovariance when 2 of the 4 values are masked 
array(4.5) 

其原因在於,後者的做法結合了面具的2個變量是這樣的:

>>> mask2 = masked_c.mask.any(axis=0) 
>>> all_masked_c = np.ma.array(c, mask=np.vstack((mask2, mask2))) 
>>> all_masked_c 
masked_array(data = 
[[1 -- -- 4] 
[1 -- -- 4]], 
      mask = 
[[False True True False] 
[False True True False]], 
     fill_value = 999999) 

>>> np.ma.cov(all_masked_c) # same function call as the first approach, but with a different mask! 
masked_array(data = 
[[4.5 4.5] 
[4.5 4.5]], 
      mask = 
[[False False] 
[False False]], 
     fill_value = 1e+20) 

所以使用np.ma.cov,但要注意當存在不重疊的掩碼值時,如何解釋數據。