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

原文地址:https://www.cnblogs.com/anner-nie/p/8544203.html