2017-03-27 150 views
0

的時候我不知道正確的術語是在這裏什麼,但我想在使用多個條件從幾個陣列一個numpy的陣列掩蓋了一些值。例如,我想查找並屏蔽X中的區域,其中數組t/l,lat2d,x和m滿足特定條件。所有陣列的形狀相同:(250,500)。我嘗試這樣做:錯誤掩蓋2D numpy的陣列

cs[t < 274.0 | 
    l > 800.0 | 
    lat2d > 60 | 
    lat2d < -60 | 
    (x > 0 & m > 0.8) | 
    (x < -25 & m < 0.2)] = np.nan 

ufunc「bitwise_and」不支持輸入類型,並輸入無法根據鑄造規則被安全地強制轉換爲任何支持的類型「」安全「」。

我更換了&,|用和/或與得到了錯誤:

ValueError異常:具有多於一個元素的數組的真值是不明確的。使用a.any()或a.all()

我試圖創建一個面膜:面膜= T < 274.0 | l> 800.0 | lat2d> 60 | lat2d < -60 | (x> 0 & m> 0.8)| (x < -25 & m < 0.2),以便在掩碼數組中使用但得到相同的錯誤。

任何想法如何在Python 3中做到這一點?

+0

是陣列'L,T ,m,x,lat2d'固定? – kmario23

+0

是的,陣列是固定的。 – Shejo284

回答

1

這僅僅是一個運算符優先級的事情:

cs[(t < 274.0) | 
    (l > 800.0) | 
    (lat2d > 60) | 
    (lat2d < -60) | 
    ((x > 0) & (m > 0.8)) | 
    ((x < -25) & (m < 0.2))] = np.nan 

應該工作

+0

這是非常整潔! – kmario23

+0

那麼括號是問題嗎?你能解釋一下你的()與我的不同嗎? – Shejo284

+1

@ Shejo284我認爲它歸結爲按順序記住優先規則「PEMDAS」。因此,使用括號總是會使事情變得明確並具有更高的優先級(即先評估) – kmario23

0

你可以使用一個Python函數,然後應用在陣列上的功能做到這一點。

def cond(x): 
    if (np.all(t < 274.0) or np.all(l > 800.0) or np.all(lat2d > 60) or \ 
     np.all(lat2d < -60) or (np.all(x > 0) and np.all(m > 0.8)) or \ 
     (np.all(x < -25) and np.all(m < 0.2))): 
     return np.nan 

然後在陣列上應用此功能:

cs[:] = np.apply_along_axis(cond, 0, cs) 
+0

這是一個有趣的想法,但其他建議的解決方案工作和較少的代碼。欣賞提示雖然:-) – Shejo284