2016-03-15 58 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

非常感谢。这绝对是我的案例的最佳答案!经过几天的努力解决这个问题后,感觉减轻了!再次感谢。 –

相关问题