np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的到的官方人员的回复-总结可行方案

np.argsort 与获取位相关问题

位次: 数组中的数据在其排序之后的另一个数组中的位置
[1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4

这里先直接给出结论,np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致,但后来numpy的开发人员给我举例回复这是巧合,如果想获取位次,可以考虑使用scipy.stats.rankdata()方法,也组合numpy中其他函数。


我当时以为没有重复数据的时候就可以返回位次,但是有重复数据的时候不行,所以提问的标题是当时以为的情况,但后续讨论就是我这篇博客标题说的内容了

在这里插入图片描述

  • 如果你想了解一下问题产生的原因和和听我絮叨拆解补充分析一下一下我俩对话的内容,可以扫一下下面的内容,或者根据经验自己跳着读。

1.问题的产生

事情是这样的在做项目的时候我遇到了这样一个问题,我要对某一个对象的收入进行分析,emmmm, 还是要举一个实际的例子,假设我要对一种奶茶店的收入进行分析,例如我要分析5个店面的这个月的收入情况,每个店面的收入由三部分组成,奶茶,果茶,冰淇淋。

店铺编号 总收入 果茶收入 奶茶收入 冰淇淋收入
店铺1 1954 100 911 754
店铺2 1663 300 949 705
店铺3 1765 200 822 388
店铺4 1437 500 911 252
店铺5 1410 400 105 932

首先先根据总收入这一列的数据对每一行进行排序
以下是常用的代码

# 原始列表
original_list = [
    ['店铺1', 1954, 100, 911, 754],
    ['店铺2', 1663, 300, 949, 705],  
    ['店铺3', 1765, 200, 822, 388],  
    ['店铺4', 1437, 500, 911, 252],
    ['店铺5', 1410, 400, 105, 932]
]

# 使用.sort()方法根据总收入对列表进行排序
original_list.sort(key=lambda x: x[1], reverse=True)

那么从大到小的排序结果如下,按照顺序其实就是总收入的排名

店铺编号 总收入 果茶收入 奶茶收入 冰淇淋收入
店铺1 1954 100 911 754
店铺3 1765 200 822 388
店铺2 1663 300 949 705
店铺4 1437 500 911 252
店铺5 1410 400 105 932

好那接下来我想在这个表里在果茶收入,奶茶收入,冰淇淋收入前面各加一列,分别为果茶收入排名,奶茶收入排名,冰淇淋收入排名。

店铺编号 总收入 果茶收入排名 果茶收入 奶茶收入排名 奶茶收入 冰淇淋收入排名 冰淇淋收入
店铺1 1954 待计算 100 待计算 911 待计算 754
店铺3 1765 待计算 200 待计算 822 待计算 388
店铺2 1663 待计算 300 待计算 949 待计算 705
店铺4 1437 待计算 500 待计算 911 待计算 252
店铺5 1410 待计算 400 待计算 105 待计算 932

那这个排名怎么得到,首先拿出奶茶这一列的数据。

然后就想用什么函数, 这时候忽然依稀的想起,数据对应的位置就是索引+1, 例如索引为0的数据实际上是列表的第1个数据,也就是位置为1,然后好像记得np.argsort()就是返回排序的索引,索引+1表示的应该就是他的位置,又排序了又有位置,虽然下意识有点怀疑感觉哪里不对,但是决定还是直接用一下再说,
然后我就使用了类似于果茶排名的数据进行了下面的操作(默认从小到大)

import numpy as np
data = [100, 200, 300, 500, 400]
rank = np.argsort(data) + 1
print(rank)
# [1 2 4 5 3]

呀(二声)!?
从小到大的看∑( 口 ||好像是对的哈,是位次

然后我就对所有的列都这样操作了将返回结果作为了位序的结果,由于收入数据很少有一样的而且数量很多所以其实不太好一眼看出逻辑错误,可能就观察了前几个,发现相对关系好像没问题就没再仔细检查了,但是在后续实际数据中由于有一些数据不存在,所以我直接都给赋值成了-1我认为这样的话他会被排在两边,但是存在大量的-1之后发现了问题。

如果按照位次的逻辑,下面的结果不就是胡排八排吗
默认是从小到大排的-1对应的位置是4,和3 在中间是怎么回事,1,2才是对的把,或者两个都是1

import numpy as np
data = [1, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩浩的科研笔记

这我为您答疑发送资源的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值