3. 分段函数

  1. numpy.where(condition[, x, y]):它类似于pythonx if condition else ycondition/x/y都是数组,要求形状相同或者通过广播之后形状相同。产生结果的方式为: 如果condition某个元素为True或者非零,则对应的结果元素从x中获取;否则对应的结果元素从y中获取 where

  2. 如果分段数量增加,则需要嵌套多层的where()。此时可以使用select()numpy.select(condlist, choicelist, default=0)

    • 其中condlist为长度为 N的列表,列表元素为数组,给出了条件数组

    • choicelist为长度为N的列表,列表元素为数组,给出了结果被选中的候选值。

    • 所有数组的长度都形状相同,如果形状不同,则执行广播。结果数组的形状为广播之后的形状。

    • 结果筛选规则如下:

      • condlist左到右扫描,若发现第 i 个元素(是个数组)对应位置为True或者非零,则输出元素来自choicelist 的第 i 个元素(是个数组)。因此若有多个condlist的元素满足,则只会使用第一个遇到的。
      • 如果扫描结果是都不满足,则使用default select
  3. 采用where/select时,所有的参数需要在调用它们之前完成。在计算时还会产生许多保存中间结果的数组。因此如果输入数组很大,则将会发生大量内存分配和释放。 为此numpy提供了piecewise函数: numpy.piecewise(x, condlist, funclist, *args, **kw)

    • x:为分段函数的自变量取值数组

    • condlist:为一个列表,列表元素为布尔数组,数组形状和x相同。

    • funclist:为一个列表,列表元素为函数对象。其长度与condlist相同或者比它长1。

      • condlist[i]对应位置为 True时,则该位置处的输出值由 funclist[i]来计算。如果funclist长度比condlist长1,则当所有的condlist都是False时,则使用 funclist[len(condlist)]来计算。如果有多个符合条件,则使用最后一个遇到的(而不是第一个遇到的)
      • 列表元素可以为数值,表示一个返回为常数值(就是该数值)的函数。
    • args/kw:用于传递给函数对象funclist[i]的额外参数。 piecewise