首页 > 编程笔记

Numpy数组排序与查询操作

在进行数组操作的时候我们可能需要对数组进行排序和查询。排序中需要注意是按行排序,还是按列排序,或者是整体排序。

1. sort()排序

这里需要特别注意的是,sort 方法中 axis 参数指的是排序的方向,0 指按行进行操作,1 指按列进行操作。示例代码如下。
In [1]: import numpy as np
In [2]: a = np.array([[1,4],
   ...:               [3,2]]) 
因为当 axis=0 时比较小的值排在第 1 行,比较大的值排在第 2 行。
In [3]: np.sort(a,axis=0)  # 按行排序
Out[3]: 
array([[1, 2],
       [3, 4]])
当 axis=1 时比较小的值排在第 1 列,而比较大的值则排在第 2 列。
In [4]: np.sort(a,axis=1)  # 按列排序
Out[4]: 
array([[1, 4],
       [2, 3]]) 
当 axis=None 时,按整体进行排序,数组将会被压缩为一个序列。
In [5]: np.sort(a,axis=None)  # 整体排序
Out[5]: array([1, 2, 3, 4]) 

2. argsort()排序

argsort 方法用来返回排序的值,这个值代表了该值在该排序方式下的顺序,会根据 axis 设置的不同方式返回不同的值。
In [6]: np.argsort(a,axis=0)  # 按行返回元素序号
Out[6]: 
array([[0, 1],
       [1, 0]], dtype=int64)
In [7]: np.argsort(a,axis=1)  # 按列返回元素序号
Out[7]: 
array([[0, 1],
       [1, 0]], dtype=int64)
In [8]: np.argsort(a,axis=None)  # 整体返回元素序号
Out[8]: array([0, 3, 2, 1], dtype=int64) 

3. 使用where()查询数组

在查询数组的过程中,最常用到的是 where 方法,该方法返回的是符合条件的值的坐标。另外,还可以通过 argmax 等方法获得数组中最大值和最小值的坐标,注意 axis 参数的设定。示例代码如下。
In [1]: import numpy as np
In [2]: a = np.array([[1,2,3,4],
   ...:               [5,6,7,8],
   ...:               [9,10,11,12],
   ...:               [13,14,15,16]]) 
where 方法用来返回符合条件的坐标,比如我们想要获得大于 7 的所有值的坐标,可以看出 8 是第一个比 7 大的数字,所以数字 8 的坐标 [1,3] 会被返回,同样的道理, 9 的坐标 [2,0] 也会被返回。

这里需要注意的是,返回的形式是将所有元素的横坐标放在一个数组里,然后将所有元素的纵坐标放在另一个数组里。这种做法的好处是方便以后取值。

In [3]: index=np.where(a > 7)
In [4]: index
Out[4]: 
(array([1, 2, 2, 2, 2, 3, 3, 3, 3], dtype=int64),
array([3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)) 
可以直接将上述结果用索引方法索引出来。
In [5]: a[index]
Out[5]: array([ 8,  9, 10, 11, 12, 13, 14, 15, 16]) 

4. argmax()查询最大值坐标

argmax 方法用来获得行列里最大值的坐标,这里可以通过指定 axis 获得最大值所在的行。可以看到在数组 a 中,各个列的坐标的最大值都是在第 3 行。
In [6]: np.argmax(a,axis=0)  #按行获取最大值的坐标
Out[6]: array([3, 3, 3, 3], dtype=int64)
同理,可以通过 argmax 方法获得每一行最大值所在的列。
In [7]: np.argmax(a, axis=1)  #按列获取最大值的坐标
Out[7]: array([3, 3, 3, 3], dtype=int64) 
类似地,可以获得该数组最大值所在的位置,这样的操作其实是将数组先转换为一个序列,然后返回这个序列的下标。
In [8]: np.argmax(a, axis=None)  # 整体获得最大值的坐标
Out[8]: 15

5. argmin()查询最小值坐标

argmin 方法和 argmax 方法对应,用来获得最小值的下标,这里不再赘述。
In [9]: np.argmin(a, axis=0)  # 按行获得最小值的坐标
Out[9]: array([0, 0, 0, 0], dtype=int64)
In [10]: np.argmin(a, axis=1)  # 按列获得最小值的坐标
Out[10]: array([0, 0, 0, 0], dtype=int64)
In [11]: np.argmin(a, axis=None)  # 整体获得最小值的坐标
Out[11]: 0 

优秀文章