索引排序
最近看了关于索引排序的东西(排序信息能被其他数组使用),比较绕,在此总结一下。
背景:
比如你对矩阵进行特征分解,得到特征向量的数组和特征值的数组(他们是一一对应的),有时候你需要对特征值进行从大到小排序(PCA等),同时特征值也需要相应的排序。
牛刀小试:
1 #coding=utf-8 2 import numpy as np 3 li=[14,13,11,12,15] 4 li=np.array(li) 5 arg_sort=np.argsort(li)# arg_sort= 2 3 1 0 4 6 arg_sort_back=np.argsort(arg_sort) # arg_sort_back= 3 2 0 1 4 7 li_sort=li[arg_sort] #li_sort = 11 12 13 14 15 8 li_sort_back=li_sort[arg_sort_back] #li_sort_back =14 13 11 12 15
注:L8 排序结果又回去了,是不是很有意思
其中L5行的arg_sort就是排序的信息。
解释:
其他语言一般有sort函数,但一般是对源数据直接进行排序。如何实现上述这个功能
以d3.js为例:
等价写法:
1 var li=[14,13,11,12,15]; 2 var arg_sort=d3.range(5).sort(function(a, b) { return d3.ascending(li[a], li[b]); }); 3 4 var li_sort=[] 5 for( var i in arg_sort){ 6 li_sort.push(li[arg_sort[i]]) 7 }
这是遍历arg_sort(内部存放的是li排序后的位置【索引】)。如果遍历li的话,能通过arg_sort获取到每个元素应该放置的位置。