python集合排序_numpy排序与集合运算用法示例

排序

numpy与python列表内置的方法类似,也可通过sort方法进行排序。

用法如下:

In [1]: import numpy as np

In [2]: x = np.random.randn(9)

In [3]: x

Out[3]:

array([-0.4041504 , -0.42198556, 0.92807217, -2.66609196, 1.50915897,

0.38080873, 1.05325796, -1.16488798, 0.04062064])

In [4]: x.sort()

In [5]: x

Out[5]:

array([-2.66609196, -1.16488798, -0.42198556, -0.4041504 , 0.04062064,

0.38080873, 0.92807217, 1.05325796, 1.50915897])

可以发现上述的sort方法是直接对x进行了排序而并没有创建一个副本。

但是np.sort()这个顶级的方法,会返回一个副本:

In [6]: x = np.random.randn(6)

In [7]: x

Out[7]:

array([ 0.14240205, 0.48903869, 0.22528632, 1.31659382, 0.00352338,

0.95574862])

In [8]: np.sort(x)

Out[8]:

array([ 0.00352338, 0.14240205, 0.22528632, 0.48903869, 0.95574862,

1.31659382])

In [9]: x

Out[9]:

array([ 0.14240205, 0.48903869, 0.22528632, 1.31659382, 0.00352338,

0.95574862])

传入轴编号,可以实现在某一个轴向上进行排序。

In [34]: x = np.random.randn(5,4)

In [35]: x

Out[35]:

array([[-0.26646799, -0.40714749, -0.76788268, -0.25340467],

[ 0.70099086, -0.88716684, 0.13461279, 2.14412835],

[ 0.39718924, -0.14671297, -0.67821163, 1.85798273],

[-0.29389289, 0.0346094 , 0.25213133, 0.87105479],

[-0.10797243, 1.60188878, 0.67829493, 0.43291808]])

In [36]: s = x

In [37]: s.sort(0)#按列进行排序

In [38]: s

Out[38]:

array([[-0.29389289, -0.88716684, -0.76788268, -0.25340467],

[-0.26646799, -0.40714749, -0.67821163, 0.43291808],

[-0.10797243, -0.14671297, 0.13461279, 0.87105479],

[ 0.39718924, 0.0346094 , 0.25213133, 1.85798273],

[ 0.70099086, 1.60188878, 0.67829493, 2.14412835]])

In [39]: x

Out[39]:

array([[-0.29389289, -0.88716684, -0.76788268, -0.25340467],

[-0.26646799, -0.40714749, -0.67821163, 0.43291808],

[-0.10797243, -0.14671297, 0.13461279, 0.87105479],

[ 0.39718924, 0.0346094 , 0.25213133, 1.85798273],

[ 0.70099086, 1.60188878, 0.67829493, 2.14412835]])

In [40]: x = np.random.randn(5,4)

In [41]: x

Out[41]:

array([[ 0.82309157, -0.56413805, -0.1766557 , -0.31924962],

[-1.25606694, 2.63622922, 2.47481377, 0.27840961],

[ 0.63659583, 1.52779004, -0.90582752, 0.82325241],

[-1.52664294, -0.5285837 , -1.96380368, -0.44323125],

[ 1.94859294, 2.55676806, 1.53614848, -0.43366557]])

In [42]: x.sort(1)#按行进行排序

In [43]: x

Out[43]:

array([[-0.56413805, -0.31924962, -0.1766557 , 0.82309157],

[-1.25606694, 0.27840961, 2.47481377, 2.63622922],

[-0.90582752, 0.63659583, 0.82325241, 1.52779004],

[-1.96380368, -1.52664294, -0.5285837 , -0.44323125],

[-0.43366557, 1.53614848, 1.94859294, 2.55676806]])

在这儿,我试图将x赋值给s,结果发现对s排序后,x也变了,这说明,在内存中,实际上,s,x是指向同一组值得。

我也曾试图输入s.sort(2),结果出现了ValueError:axis(=2)outofbounds,这也就和前面的统计函数的axis参数是一致的。

那么也就是说,他的用法和axis一致。

利用排序,我们还能得到分位数(

分位数(英语:Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。具体可自行搜索),从而得到特定位置的值。

In [44]: x = np.random.randn(500)

In [45]: x.sort()

In [46]: x[int(0.05 * len(x))] #5%分位数

Out[46]: -1.7657191623368329

还有很多没有深入了解,比如怎么降序排列,待续。

集合运算

unique(x)返回集合中的唯一值,并排序,其实也就是去除重复值。

In [1]: import numpy as np

In [2]: str = np.array(['s','f','r','s','d','f','w','r'])

In [3]: np.unique(str)

Out[3]:

array(['d', 'f', 'r', 's', 'w'],

dtype='

In [4]: i = np.array([2,2,2,2,1,1,3,4,5,4,3,5])

In [5]: np.unique(i)

Out[5]: array([1, 2, 3, 4, 5])

intersect1d(x,y)返回集合A和B的交集,并排序

In [6]: k = np.arange(8)

In [7]: np.intersect1d(i, k)

Out[7]: array([1, 2, 3, 4, 5])

union1d(x,y)返回集合A和B的并集,并排序

In [8]: np.union1d(i,k)

Out[8]: array([0, 1, 2, 3, 4, 5, 6, 7])

in1d(x,y)返回一个A包含于B的布尔型数组

In [10]: np.in1d(k,i)

Out[10]: array([False, True, True, True, True, True, False, False], dtype=bool)

setdiff1d(x,y)集合的差,包含于A但不包含于B,相当于A-(A∩B)

In [12]: np.setdiff1d(k,i)

Out[12]: array([0, 6, 7])

setxor1d(x,y)存在于A中但不同时存在于B中,也就是对称差,说白了就是A和B交集之外的部分。

20171215105548951.png?2017111510561

就是红色的部分。

In [13]: s = np.arange(4,12)

In [14]: s

Out[14]: array([ 4, 5, 6, 7, 8, 9, 10, 11])

In [15]: np.setxor1d(s,k)

Out[15]: array([ 0, 1, 2, 3, 8, 9, 10, 11])

总结

以上就是本文关于numpy排序与集合运算用法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值