argsort(array):返回的是从小到大排序的索引。
形式1:argsort(array)
>>> a=[5,2,3]
>>> b=np.argsort(a)
>>> b
array([1, 2, 0])
>>>
5,2,3的从小到大的2,3,5,索引分别是[1,2,0] 返回的是这个。
在faster中的layer_utils文件夹的proposal_top_layer.py中有如下代码段
#统计有多少个框
length = scores.shape[0]
if length < rpn_top_n:#如果小于5000,就随机采样,就是说如果框少于5000个,我也要随机重复采样,让它变成5000个框。
# Random selection, maybe unnecessary and loses good proposals
# But such case rarely happens
top_inds = npr.choice(length, size=rpn_top_n, replace=True)#size是采样的数量,replace为true为有放回采样,false为不放回采样。
else:
top_inds = scores.argsort(0)[::-1]
top_inds = top_inds[:rpn_top_n]
top_inds = top_inds.reshape(rpn_top_n, )
注意到
top_inds = scores.argsort(0)[::-1]
这里面,argsort的形式为:np.argsort()[num]
0应该时一个维度问题,下面分情况研究一下。
形式2:array.argsort(axi=0或者1)
当argsort(0)时,按矩阵列从小到大排序
当argsort(1)时,按矩阵行从小到大排序
>>> a
array([[2, 3],
[5, 3],
[6, 4]])
>>> b=a.argsort(1)
>>> b
array([[0, 1],
[1, 0],
[1, 0]])
>>> b=a.argsort(0)
>>> b
array([[0, 0],
[1, 1],
[2, 2]])
加上num就是另一种形式了
形式3:array.argsort(axi=0或者1)[num]
Num很好理解,就是从小到大排序,如果是num=2,就找排序后下标是2的数的索引,下标从0开始,所以2就是第三大的数所对应的索引。但这个时候,前面的(axi=0或者1)意思与形式2不同,0代表的是从小到大排序,1代表的是从大到小排序。
所以下面的例子中,
a.argsort(0)[2]返回的是下标为2也就是第三大的数,
a.argsort(1)[2]表示的是第三小的数,这里维度只有3,所以也就是最小的数。
注意到,都是按列来算的。跟a.argsort(0)和a.argsort(1)意思已经不一样了。
>>> a
array([[2, 3],
[5, 1],
[6, 4],
[4, 9]])
>>> b=a.argsort(1)[3]
>>> b
array([0, 1])
>>> b=a.argsort(0)[3]
>>> b
array([2, 3])
>>> a
array([[2, 3],
[5, 1],
[6, 4],
[4, 9]])
再举一个例子
>>> a
array([[2, 3],
[5, 1],
[6, 4]])
>>> a
array([[2, 3],
[5, 1],
[6, 4]])
>>> b=a.argsort(0)[2]
>>> b
array([2, 2])
>>> b=a.argsort(1)[2]
>>> b
array([1, 0])
>>>
从小到大排序,排序后第三大的数对应的索引,按列来看,就是array([2, 2])对应下面第一列的6和第二列的4
>>> a
array([[2, 3],
[5, 1],
[6, 4]])
而b=a.argsort(1)[2]就是从大到小排序,倒数最第三大的,也就是从小到大排序中最小的,分别是第一列的2和第二列的1,索引分别是array([1, 0])。验证完毕。