Skip to content

Latest commit

 

History

History
308 lines (193 loc) · 3.76 KB

034.md

File metadata and controls

308 lines (193 loc) · 3.76 KB

数组排序

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])