Numpy数组排序

数组排序

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

sort 函数

sort 函数

先看这个例子:

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

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

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

argsort 函数

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

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

可以用它来进行索引:
可以用它来进行索引:

weights[ordered_indices]
array([ 20.8,  53.4,  61.8,  93.2])

​```python
names[ordered_indices]
array(['bob', 'jan', 'ad', 'sue'], 
      dtype='|S3')

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

weights
array([ 20.8,  93.2,  53.4,  61.8])

sort 和 argsort 方法

sort 和 argsort 方法

数组也支持方法操作:

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

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

data
array([ 20.8,  93.2,  53.4,  61.8])

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

data.sort()
data
array([ 20.8,  53.4,  61.8,  93.2])

二维数组排序

二维数组排序

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

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

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

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

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

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

searchsorted 函数

searchsorted 函数

searchsorted(sorted_array, values)

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

sorted_array = linspace(0,1,5)
values = array([.1,.8,.3,.12,.5,.25])
searchsorted(sorted_array, values)
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

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

不加括号,默认是元组:

bounds = .4, .6
bounds
(0.4, 0.6)

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

low_idx, high_idx = searchsorted(data, bounds)

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

data[low_idx:high_idx]
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])

Author: Juntech
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Juntech !
评论
  TOC