数组的排序和查找
-
排序
- sort()
>>> test array([[13, 2, 4], [13, 2, 17], [ 8, 1, 19], [19, 1, 18]]) >>> test.sort() >>> test array([[ 2, 4, 13], [ 2, 13, 17], [ 1, 8, 19], [ 1, 18, 19]])
可以定义需要排序的轴(注意:test已经变了哦)
>>> np.sort(test,axis=0) #按列排序 array([[ 1, 4, 13], [ 1, 8, 17], [ 2, 13, 19], [ 2, 18, 19]])
sort()的order定义排序的关键字段
>>> dtype = [('name','U10'), ('height','float'),('weight','int')] >>> values = [('小明', 170.0, 58), ('小张', 170.0,53), ('小李', 180.5, 58)] >>> c = np.array(values, dtype=dtype) >>> c array([('小明', 170. , 58), ('小张', 170. , 53), ('小李', 180.5, 58)], dtype=[('name', '<U10'), ('height', '<f8'), ('weight', '<i4')])
先以身高排序,如果身高一样则按照体重排序
>>>> np.sort(c, order=['height', 'weight']) array([('小张', 170. , 53), ('小明', 170. , 58), ('小李', 180.5, 58)], dtype=[('name', '<U10'), ('height', '<f8'), ('weight', '<i4')])
我们可以看到,之前我们的test已经变了,这是因为我们使用的是数组对象的sort(),会直接改变数组,倘若我们使用numpy的sort,则不会改变
>>> test = np.array([[13, 2, 4], [13, 2, 17], [ 8, 1, 19], [19, 1, 18]]) >>> np.sort(test) array([[ 2, 4, 13], [ 2, 13, 17], [ 1, 8, 19], [ 1, 18, 19]]) >>> test array([[13, 2, 4], [13, 2, 17], [ 8, 1, 19], [19, 1, 18]])
- lexsort():用于返回排序结果的索引值
a = [5,1,4,2,8,1] b = [9,5,7,4,10,4] np.lexsort((a,b)) array([5, 3, 1, 2, 0, 4], dtype=int64)
这里是对a,b两个列表进行排序。输入可以是数组,也可以是有序数字。下面来解释一下结果的第一个数字5的含义:
该函数默认从最后一行开始向前排序,首先先对b表排序,该行最小值是4,索引为3和5,然后根据a列表里的数字排序,索引位置3,5对应的数是2,1.故5在3前面。
-
查找
- searchsorted()。查找一个合适的位置,将元素插入数组中且保证数组元素顺序不被打乱。
>>> a [5, 1, 4, 2, 8, 1] >>> np.searchsorted(a,7) 6 >>> np.searchsorted(a, [3,8,22]) array([6, 6, 6], dtype=int64)
可以看到第一个位置是3,因为插入数字3在2后面,整个序列的顺序不改变
searchsorted()有一个参数是side,可以设置返回第一个位置还是最后一个位置。
>>> b = [9,5,7,4,10,4] >>> np.searchsorted(b, [4,8,22], side='left') array([0, 6, 6], dtype=int64) >>> np.searchsorted(b, [4,8,22], side='right') array([6, 6, 6], dtype=int64)
- extract()可以用来提取满足一定条件的元素
>>> arr = np.arange(16).reshape(4,4) >>> con = np.mod(arr,4) != 0 >>> np.extract(con,arr) array([ 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15])
扩充转换
标准的扩充转换目的是:使形状不一样的数组能够运算。
需要遵循以下原则:
- 除维度最大的输入数组外,其余的所有输入数组的维度向输入数组中维度最大的数组靠齐,并把那个维度考虑为1
- 输出数组在各个维度上的长度和所有输入数组在那个维度上的最大长度一样。
- 如果输入数组在某个维度上的长度为1,或者和输入数组在那个长度上的长度一样,会被用于实际的计算过程。
- 如果输入数组在某个维度上的长度为1,那个这个维度上的第一个元素会被用于后续在该维度上的计算。
>>> a = 10
>>> b = np.arange(5)
>>> a * b
array([ 0, 10, 20, 30, 40])
可以把这个数字看作形状为(5,)的数组。a扩充为[10,10.10,10,10]