3. 分段函数
numpy.where(condition[, x, y])
:它类似于python
的x if condition else y
。condition/x/y
都是数组,要求形状相同或者通过广播之后形状相同。产生结果的方式为: 如果condition
某个元素为True
或者非零,则对应的结果元素从x
中获取;否则对应的结果元素从y
中获取如果分段数量增加,则需要嵌套多层的
where()
。此时可以使用select()
:numpy.select(condlist, choicelist, default=0)
。其中
condlist
为长度为N
的列表,列表元素为数组,给出了条件数组choicelist
为长度为N
的列表,列表元素为数组,给出了结果被选中的候选值。所有数组的长度都形状相同,如果形状不同,则执行广播。结果数组的形状为广播之后的形状。
结果筛选规则如下:
- 从
condlist
左到右扫描,若发现第i
个元素(是个数组)对应位置为True
或者非零,则输出元素来自choicelist
的第i
个元素(是个数组)。因此若有多个condlist
的元素满足,则只会使用第一个遇到的。 - 如果扫描结果是都不满足,则使用
default
- 从
采用
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]
的额外参数。