数组排序

In [1]:

  1. %pylab
  1. Using matplotlib backend: Qt4Agg
  2. Populating the interactive namespace from numpy and matplotlib

sort 函数

先看这个例子:

In [2]:

  1. names = array(['bob', 'sue', 'jan', 'ad'])
  2. weights = array([20.8, 93.2, 53.4, 61.8])
  3.  
  4. sort(weights)

Out[2]:

  1. array([ 20.8, 53.4, 61.8, 93.2])

sort 返回的结果是从小到大排列的。

argsort 函数

argsort 返回从小到大的排列在数组中的索引位置:

In [3]:

  1. ordered_indices = argsort(weights)
  2. ordered_indices

Out[3]:

  1. array([0, 2, 3, 1], dtype=int64)

可以用它来进行索引:

In [4]:

  1. weights[ordered_indices]

Out[4]:

  1. array([ 20.8, 53.4, 61.8, 93.2])

In [5]:

  1. names[ordered_indices]

Out[5]:

  1. array(['bob', 'jan', 'ad', 'sue'],
  2. dtype='|S3')

使用函数并不会改变原来数组的值:

In [6]:

  1. weights

Out[6]:

  1. array([ 20.8, 93.2, 53.4, 61.8])

sort 和 argsort 方法

数组也支持方法操作:

In [7]:

  1. data = array([20.8, 93.2, 53.4, 61.8])
  2. data.argsort()

Out[7]:

  1. array([0, 2, 3, 1], dtype=int64)

argsort 方法与 argsort 函数的使用没什么区别,也不会改变数组的值。

In [8]:

  1. data

Out[8]:

  1. array([ 20.8, 93.2, 53.4, 61.8])

但是 sort方法会改变数组的值:

In [9]:

  1. data.sort()

In [10]:

  1. data

Out[10]:

  1. array([ 20.8, 53.4, 61.8, 93.2])

二维数组排序

对于多维数组,sort方法默认沿着最后一维开始排序:

In [11]:

  1. a = array([
  2. [.2, .1, .5],
  3. [.4, .8, .3],
  4. [.9, .6, .7]
  5. ])
  6. a

Out[11]:

  1. array([[ 0.2, 0.1, 0.5],
  2. [ 0.4, 0.8, 0.3],
  3. [ 0.9, 0.6, 0.7]])

对于二维数组,默认相当于对每一行进行排序:

In [12]:

  1. sort(a)

Out[12]:

  1. array([[ 0.1, 0.2, 0.5],
  2. [ 0.3, 0.4, 0.8],
  3. [ 0.6, 0.7, 0.9]])

改变轴,对每一列进行排序:

In [13]:

  1. sort(a, axis = 0)

Out[13]:

  1. array([[ 0.2, 0.1, 0.3],
  2. [ 0.4, 0.6, 0.5],
  3. [ 0.9, 0.8, 0.7]])

searchsorted 函数

  1. searchsorted(sorted_array, values)

searchsorted 接受两个参数,其中,第一个必需是已排序的数组。

In [14]:

  1. sorted_array = linspace(0,1,5)
  2. values = array([.1,.8,.3,.12,.5,.25])

In [15]:

  1. searchsorted(sorted_array, values)

Out[15]:

  1. array([1, 4, 2, 1, 2, 1], dtype=int64)

排序数组:

0 1 2 3 4
0.0 0.25 0.5 0.75 1.0

数值:

0.1 0.8 0.3 0.12 0.5 0.25
插入位置 1 4 2 1 2 1

searchsorted 返回的值相当于保持第一个数组的排序性质不变,将第二个数组中的值插入第一个数组中的位置:

例如 0.1 在 [0.0, 0.25) 之间,所以插入时应当放在第一个数组的索引 1 处,故第一个返回值为 1

In [16]:

  1. from numpy.random import rand
  2. data = rand(100)
  3. data.sort()

不加括号,默认是元组:

In [17]:

  1. bounds = .4, .6
  2. bounds

Out[17]:

  1. (0.4, 0.6)

返回这两个值对应的插入位置:

In [18]:

  1. low_idx, high_idx = searchsorted(data, bounds)

利用插入位置,将数组中所有在这两个值之间的值提取出来:

In [19]:

  1. data[low_idx:high_idx]

Out[19]:

  1. array([ 0.41122674, 0.4395727 , 0.45609773, 0.45707137, 0.45772076,
  2. 0.46029997, 0.46757401, 0.47525517, 0.4969198 , 0.53068779,
  3. 0.55764166, 0.56288568, 0.56506548, 0.57003042, 0.58035233,
  4. 0.59279233, 0.59548555])

原文: https://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/03-numpy/03.06-sorting-numpy-arrays.ipynb