高级函数choose的使用
通过某一些条件去“选择”相关的元素,choose的操作会比自己使用for-if-else效率要高,类似的还有select函数
1、choose()函数的定义
def choose(a, choices, out=None, mode=‘raise’):
- 参数 a :它必须是一个 int 型的 数组,并且 a 中的元素,必须是0~n-1之间的数,这里的n表示的就是数组choices数组最外层的维度数。
- choices:表示的是要操作的数组,要注意的是choices的数组的维度是一定要和a进行匹配的,如果匹配不了,会出现错误。
- 参数out:接收运算结果的数组,它的维度一定要和 a 是一样的,是可选参数。
参数mode:默认的是raise,表示的是a数组中的元素不能超过 n ,她还有两个可选值,
clip:将 a 中的 元素 如果小于0,则将其变为0,如果大于n-1,则变为n-1
wrap:将a中的值 value变为value mod n,即值除以n的余数。
说的通俗一点,就是参数a这个数组的值不能超过choices数组的维度的最大值,然后a这个数组中每一个位置的数,代表的 是choices数组中的元素的索引,比如:
import numpy as np
control = np.array([[1,0,1],
[2,1,0],
[1,2,2]])
np.choose(control, [10, 11, 12])
调用choose会产生一个和control数组一样大小的数组,这个数组的每个元素是什么呢?control第一个是1,代表在[10,11,12]中的第二个元素,即11,然后第二个是0,即第一个元素,10,以此类推。
i0 = np.array([[0,1,2],
[3,4,5],
[6,7,8]])
i2 = np.array([[20,21,22],
[23,24,25],
[26,27,28]])
control = np.array([[1,0,1],
[2,1,0],
[1,2,2]])
np.choose(control, [i0, 10, i2])
结果是
array([[10, 1, 10],
[23, 10, 5],
[10, 27, 28]])
即control的第一行第一列的元素是i0数组的第一行第一列的数,第二行第一列的元素是i2数组中的第二行第一列的数。
接下来给出两个觉得很不错的操作
- 将数组中所有小于 10 的值变成了 10
In [4]:
a = np.array([[ 0, 1, 2],
[10,11,12],
[20,21,22]])
a < 10
Out[4]:
array([[ True, True, True],
[False, False, False],
[False, False, False]], dtype=bool)
In [5]:
np.choose(a < 10, (a, 10))
Out[5]:
array([[10, 10, 10],
[10, 11, 12],
[20, 21, 22]])
- 下面的例子将数组中所有小于 10 的值变成了 10,大于 15 的值变成了 15。
In [6]:
a = np.array([[ 0, 1, 2],
[10,11,12],
[20,21,22]])
lt = a < 10
gt = a > 15
choice = lt + 2 * gt
choice
Out[6]:
array([[1, 1, 1],
[0, 0, 0],
[2, 2, 2]])
In [7]:
np.choose(choice, (a, 10, 15))
Out[7]:
array([[10, 10, 10],
[10, 11, 12],
[15, 15, 15]])