关于np.argpartition()那点事
最近发现个np.argpartition()这东西,但是翻了好多博客还是看不明白,最后自己总结了很久很久,终于弄明白了这个函数
下面展示一些 内联代码片
。
import numpy as np
data=np.array([10,90,30,50,40,80,20,70,60])
# 0 1 2 3 4 5 6 7 8
# 0 6 2 4 3 8 7 5 1
k = 5
print(np.argpartition(data,k))
这个东西啥意思呢,我创建了一个数组,数组里是那些数据,然后吧,我把这个数组,按数值的大小进行了排序,注释的第一行是每个元素的下标,注释的第二行是按数值排序后的数组下标
啥意思呢?
就是说:10在数组中最小,然后它原本的下标是0,现在放在第二行注释的第一位
然后呢,第二小的是20,他原本的下标是6,所以把它的下标排在第二行的第二位,以此类推
上面代码的结果是:
[6 0 2 4 3 8 5 7 1]
打个不太恰当的比方
比如说:
有6个工人A,B,C,D,E,F
他们的老爹的名字分别是0,1,2,3,4,5
不知道大家能不能理解,这两句话意思是:
工人A他爹的名字叫0,
工人B他爹的名字叫1,
工人C他爹的名字叫2
(工人是数组元素,老爹名字是数组元素对应的下标)
然后老板要奖励干活最优秀的几个人,奖励是把优秀工人他爹的名字贴在公告栏上
工人E天天干活,干的最快最好,老板很高兴,把工人E他老爹名字排在了公告栏第一位
[4,null,null,null......] (假设这个框框[] 是公告栏,E的老爹4是第一个元素)
工人C也不赖,干活勤奋程度排在第二位,老板把C他老爹的名字排在了公告栏第二位
[4,2,null,null......]
工人A稍微发了点懒,勤奋程度是所有工人中第三位,他的老爹排在公告栏第三位
[4,2,0,null.null......]
就这么一个个排,最后公告栏上的结果为:[4,2,0,1,5,3]
现在来了个陌生人,问老板:你们这里勤奋程度第二的工人他老爹叫啥?
老板拿出公告牌一看,嗷,他爹叫2
陌生人又问,勤奋程度排第四的工人他老爹叫啥,老板再一瞅,是1
这个人又又又问:那你告诉我一下勤奋程度第三,和比第三名还勤奋的人的老爹名字行不?
老板崩溃了,这嘛人呀?问个没完了
老板把前三名的人的老爹名字杂乱地写在了一张纸上,陌生人一看,嗷,是 ‘2’ ‘4’ ‘0’ 这三个名字啊,
但是咋没有顺序啊,谁在前谁在后呢?
老板:我不管排序,我只管告诉你前三名都是谁,行了行了哪凉快哪待着去吧,别来烦我了
这就是np.argpartition()干的事
定义了一个数组:
data=np.array([10,90,30,50,40,80,20,70,60])
里面的元素10就相当于工人A,90相当于工人B,30相当于工人C,依次类推
数组元素越小代表这个工人越勤奋
np.argpartition(data,k)
分开来看:先传入一个数组data,这个函数np.argpartition(data,)就生成了一个公告栏,
公告栏里各个数组下标按顺序排好,[0 6 2 4 3 8 7 5 1]
然后传入参数K,比如K=3
np.argpartition(data,3) 这个就是陌生人在问,勤奋程度第3和在他之前的人的老爹名字是什么
(当然后面的人名字也要加上)
函数的结果是: [6 0 2 4 1 5 3 7 8]
这个结果的意思是,我传入的参数k=3,我想知道第三位的人是谁,所以结果的第三位和公告栏的第三位是一模一样的
前两位的位置是乱序的,6在第一位也行,0在第一位也行,后面几位也是乱序的
我只要保证第三位的下标是2,前面那俩数随便怎么换位置,第三位后面的数也可以随便换位置