np.argsort 与获取位相关问题
位次: 数组中的数据在其排序之后的另一个数组中的位置
[1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4
这里先直接给出结论,np.argsort()
返回的索引排序与实际位次在确实在某些情况下会出现一致,但后来numpy的开发人员给我举例回复这是巧合,如果想获取位次,可以考虑使用scipy.stats.rankdata()
方法,也组合numpy中其他函数。
- 如果你是想解决问题的开发人员直接根据目录跳转到最后方法总结查看示例代码,或者按照函数名直接搜索官方文档即可
- 如果你有相关问题的思考想直接看一下我和开发人员的探讨内容,直接点击链接去GitHub中查看即可
链接: https://github.com/numpy/numpy/issues/25601
我当时以为没有重复数据的时候就可以返回位次,但是有重复数据的时候不行,所以提问的标题是当时以为的情况,但后续讨论就是我这篇博客标题说的内容了
- 如果你想了解一下问题产生的原因和和听我絮叨拆解补充分析一下一下我俩对话的内容,可以扫一下下面的内容,或者根据经验自己跳着读。
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,