2016-03-15 8 views
1

我有一個3D矩陣(lon,lat,hight),其中某些元素的值爲0.我想用它們的previus級別的數據替換這些值,直到所有零數據被替換。這意味着如果'a'是矩陣[i,j,k],那麼我想用[i,j,k-1]替換其中的零值,並且如果前一個值再次爲零,則需要previus數據直到它獲得價值。我已經嘗試了下面的代碼,但它給出了錯誤,而且我做了什麼結果是無稽之談。 LW是一個nc文件。如何用Python中的previus數據替換具有3D矩陣中特定值的元素?

LW = S.netcdf_file('/path','r') 
a = LW.variables['nflx'][:,:,:] 
lona = LW.variables['lon'][:] 
lata = LW.variables['lat'][:] 

M = np.zeros([96,73,25]) 
for i in xrange(0, 96): 
    for j in xrange(0, 73): 
    for k in xrange(0,25): 
     while a==0: 
      M = a[:,:,k-1] 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

有人有什麼想法嗎?所有的幫助表示讚賞。

+0

請在您的示例中檢查變量'M'和'a'。 'M'是一個數組,但得到一個標量,'a'是一個未定義的數組。 – Chickenmarkus

+0

是的。它是在代碼的前一部分中定義的具有3維[i,j,k]的矩陣。我剛剛將M定義爲一個新的矩陣,但它與替換爲零的'a'相同。 –

回答

0

這是一個簡單而動態的方式。每個子數組M [i,j]將作爲循環處理。如果第一個值爲零,它將被最後一個值替換。

>>> M = np.arange(20) 
... M[[6,11,12,19]] = 0 
... M = M.reshape((2,2,5)) 
... print(M) 
[[[ 0 1 2 3 4] 
    [ 5 0 7 8 9]] 

[[10 0 0 13 14] 
    [15 16 17 18 0]]] 
>>> for i in np.ndindex(M.shape[:-1]): 
...  while 0 in M[i]: 
...   args = np.argwhere(M[i]==0) 
...   M[i][args] = M[i][args-1] 
... print(M) 
[[[ 4 1 2 3 4] 
    [ 5 5 7 8 9]] 

[[10 10 10 13 14] 
    [15 16 17 18 18]]] 
+0

謝謝你的回答,但是當你把M [:,:,10] = 1.0時,它就是那個值爲1.0的水平,其餘的都是零。我剛剛添加了我的代碼的第一部分'a'被定義。當我使用'a'而不是'M'時,我有這個錯誤:RuntimeError:數組不可寫? –

+0

我編輯了我的答案,輸出了示例值,我如何理解您的問題。如果這是不正確的,請添加您的矩陣的一個小例子,以及它的外觀應該與我的類似。 – Chickenmarkus

+0

非常感謝。這絕對是我的案例的最佳答案!經過幾天的努力解決這個問題後,感覺減輕了!再次感謝。 –

相關問題