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)))