簡體   English   中英

在數組上迭代 function

[英]Iterating a function over an array

以不同的方式提出這個問題的標題。

我有一個 function ,它采用一個三維數組並根據特定條件屏蔽數組中的某些元素。 見下文:

#function for array masking 
def masc(arr,z):
        return(np.ma.masked_where((arr[:,:,2] <= z+0.05)*(arr[:,:,2] >= z-0.05), arr[:,:,2])) 
    

arr 是 3D 數組,z 是單個值。

我現在想對多個 Z 值進行迭代。 這是一個具有 2 個 z 值的示例:

masked_array1_1 = masc(xyz,z1)
masked_array1_2 = masc(xyz,z2)

masked_1 = masked_array1_1.mask + masked_array1_2.mask
masked_array1 = np.ma.array(xyz[:,:,2],mask=masked_1)

masked_array1 給了我我正在尋找的東西。

我已經開始編寫一個 forloop 來遍歷 Z 值的一維數組:

mask_1 = xyz[:,:,2]
for i in range(Z_all_dim):
    mask_1 += (masc(xyz,Z_all[i]).mask)

masked_array1 = np.ma.array(xyz[:,:,2], mask = mask_1)

Z_all 是一個包含 7 個唯一 z 值的數組。 這段代碼不起作用(整個數組最終被屏蔽)但我覺得我很接近。 有誰看到我做錯了什么?

您的問題是,在循環之前,您從mask_1 = xyz[:,:,2]開始。 將 boolean 數組添加到浮點數會將 boolean 轉換為 1 和 0,除非您的浮點數組中有任何 0,否則最終數組將全部為非零值,這會導致每個值都被屏蔽。 而是做

mask_1 = masc(xyz, Z_all[0]).mask
for z in Z_all[1:]:
    mask_1 += masc(xyz, z).mask

或避免任何循環並廣播您的操作

# No need to pass it through `np.ma.masked_where` if
# you're just going to extract just the boolean mask
mask = (xyz[...,2,None] <= Z_all + 0.05) * (xyz[...,2,None] >= Z_all - 0.05)
mask = np.any(mask, axis=-1)

暫無
暫無

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

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