簡體   English   中英

如何獲取NumPy掩碼數組的最后一個非零值?

[英]How to get the last non-zero value of NumPy masked array?

我正在制作模型。 結果存儲在NetCFD文件中,其中包含每個粒子的lon,lat和time的掩碼數據。 我想獲取每個粒子的lon,lat,time的最后一個實際值。 我設法獲得了最后一個實數的位置,但沒有獲得值本身。

你有什么建議嗎?

我的代碼如下所示:

lat1= masked_array(data=[[-14.33945369720459, -14.33945369720459, -14.339454650878906,
     -14.339454650878906, -14.339454650878906, -14.339454650878906,
     -14.339454650878906, -14.339454650878906, -14.339457511901855,
     -14.339459419250488, -14.339459419250488, -14.339459419250488,
     --, --, --, --, --, --, --, --],
    [-5.621851444244385, -5.621865272521973, -5.621881008148193,
     -5.621898651123047, -5.621916770935059, -5.621936321258545,
     -5.6219563484191895, -5.621973037719727, -5.621990203857422,
     -5.622012615203857, -5.622034072875977, -5.622053146362305, --,
     --, --, --, --, --, --, --]], mask=[[False, False, False, False, False, False, False, False, False,
     False, False, False,  True,  True,  True,  True,  True,  True,
      True,  True],
    [False, False, False, False, False, False, False, False, False,
     False, False, False,  True,  True,  True,  True,  True,  True,
      True,  True]], fill_value=nan, dtype=float32)         #latitude values of 2 particles


def last_nonzero(lat1, axis, invalid_val=-9999):
    mask = lat1!=0
    val = lat1.shape[axis] - np.flip(mask, axis=axis).argmax(axis=axis) - 1
    return np.where(mask.any(axis=axis), val, invalid_val)

last_nonzero(lat1, axis=1, invalid_val=-9999)        #for each particle, gives the position of the last real number
print lat1[last_nonzero(lat1, axis=1, invalid_val=-9999)]

如果我正確理解,您可以做的是:

  1. 獲取最后一個非零元素的索引(您已經知道如何獲取它們):

     >>> last_nonzero_indices = last_nonzero(lat1, axis=1, invalid_val=-9999) >>> last_nonzero_indices array([11, 11], dtype=int64) 
  2. 僅獲取初始數組的有效條目:

     >>> valid_values = lat1[~lat1.mask] >>> valid_values masked_array(data=[-14.33945369720459, -14.33945369720459, -14.339454650878906, -14.339454650878906, -14.339454650878906, -14.339454650878906, -14.339454650878906, -14.339454650878906, -14.339457511901855, -14.339459419250488, -14.339459419250488, -14.339459419250488, -5.621851444244385, -5.621865272521973, -5.621881008148193, -5.621898651123047, -5.621916770935059, -5.621936321258545, -5.6219563484191895, -5.621973037719727, -5.621990203857422, -5.622012615203857, -5.622034072875977, -5.622053146362305], mask=[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], fill_value=nan, dtype=float32) 
  3. 隨着返回數組的展平,請根據我們之前計算出的索引來計算相應的索引:

     >>> last_nonzero_indices = np.cumsum(last_nonzero_indices) >>> last_nonzero_indices array([11, 22], dtype=int64) 
  4. 獲取所需的最后一個非零值:

     >>> valid_values[last_nonzero_indices] masked_array(data=[-14.339459419250488, -5.622034072875977], mask=[False, False], fill_value=nan, dtype=float32) 

不過,我不太喜歡這種解決方案,希望對屏蔽數組有較深了解的人可以提出更好的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM