numpy學習(將條件邏輯表述為數組運算)


numpy.where函數是三元表達式xifconditionelsey的矢量化版本。假設我們有一個布爾數組和兩個值數組:

假設我們想要根據cond中的值選取xarr和yarr的值:當cond中的值為True時,選取xarr的值,否則從yarr中選取。列表推導式的寫法應該如下所示:

這有幾個問題。第一,它對大數組的處理速度不是很快(因為所有工作都是由純Python完成的)。第二,無法用於多維數組。若使用np.where,則可以將該功能寫得非常簡潔:

np.where的第二個和第三個參數不必是數組,它們都可以是標量值。在數據分析工作中,where通常用於根據另一個數組而產生一個新的數組。假設有一個由隨機數據組成的矩陣,你希望將所有正值替換為2,將所有負值替換為-2。若利用np.where,則會非常簡單:

傳遞給where的數組大小可以不相等,甚至可以是標量值。

只要稍微動動腦子,你就能用where表述出更復雜的邏輯。想象一下這樣一個例子,我有兩個布爾型數組cond1和cond2,希望根據4種不同的布爾值組合實現不同的賦值操作:

result = [ ]

for i in range( n):

  if cond1[ i] and cond2[ i]:

    result. append( 0)

  elif cond1[ i]:

    result. append( 1)

  elif cond2[ i]:

    result. append( 2)

  else:

    result. append( 3)

 

雖然不是非常明顯,但這個for循環確實可以被改寫成一個嵌套的where表達式:

np.where(cond1&cond2,0,

            np.where(cond1,1,

                     np.where(cond2,2,3)))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM