数组排序

In [1]:
%pylab
Using matplotlib backend: Qt4Agg
Populating the interactive namespace from numpy and matplotlib

sort 函数

先看这个例子:

In [2]:
names = array(['bob', 'sue', 'jan', 'ad'])
weights = array([20.8, 93.2, 53.4, 61.8])

sort(weights)
Out[2]:
array([ 20.8,  53.4,  61.8,  93.2])

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

argsort 函数

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

In [3]:
ordered_indices = argsort(weights)
ordered_indices
Out[3]:
array([0, 2, 3, 1], dtype=int64)

可以用它来进行索引:

In [4]:
weights[ordered_indices]
Out[4]:
array([ 20.8,  53.4,  61.8,  93.2])
In [5]:
names[ordered_indices]
Out[5]:
array(['bob', 'jan', 'ad', 'sue'], 
      dtype='|S3')

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

In [6]:
weights
Out[6]:
array([ 20.8,  93.2,  53.4,  61.8])

sort 和 argsort 方法

数组也支持方法操作:

In [7]:
data = array([20.8,  93.2,  53.4,  61.8])
data.argsort()
Out[7]:
array([0, 2, 3, 1], dtype=int64)

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

In [8]:
data
Out[8]:
array([ 20.8,  93.2,  53.4,  61.8])

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

In [9]:
data.sort()
In [10]:
data
Out[10]:
array([ 20.8,  53.4,  61.8,  93.2])

二维数组排序

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

In [11]:
a = array([
        [.2, .1, .5], 
        [.4, .8, .3],
        [.9, .6, .7]
    ])
a
Out[11]:
array([[ 0.2,  0.1,  0.5],
       [ 0.4,  0.8,  0.3],
       [ 0.9,  0.6,  0.7]])

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

In [12]:
sort(a)
Out[12]:
array([[ 0.1,  0.2,  0.5],
       [ 0.3,  0.4,  0.8],
       [ 0.6,  0.7,  0.9]])

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

In [13]:
sort(a, axis = 0)
Out[13]:
array([[ 0.2,  0.1,  0.3],
       [ 0.4,  0.6,  0.5],
       [ 0.9,  0.8,  0.7]])

searchsorted 函数

searchsorted(sorted_array, values)

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

In [14]:
sorted_array = linspace(0,1,5)
values = array([.1,.8,.3,.12,.5,.25])
In [15]:
searchsorted(sorted_array, values)
Out[15]:
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]:
from numpy.random import rand
data = rand(100)
data.sort()

不加括号,默认是元组:

In [17]:
bounds = .4, .6
bounds
Out[17]:
(0.4, 0.6)

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

In [18]:
low_idx, high_idx = searchsorted(data, bounds)

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

In [19]:
data[low_idx:high_idx]
Out[19]:
array([ 0.41122674,  0.4395727 ,  0.45609773,  0.45707137,  0.45772076,
        0.46029997,  0.46757401,  0.47525517,  0.4969198 ,  0.53068779,
        0.55764166,  0.56288568,  0.56506548,  0.57003042,  0.58035233,
        0.59279233,  0.59548555])