[英]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.