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