# np.argsort(a) 和a.sort()的区别
# np模块有两个排序np.argsort(a),a.sort(),
# list中有a.sort(),sorted(a)
# 特点,np.argsort(a),结果是输出索引,a本身是不变的,这是优点。a.sort()是从小到大排序
# 输出排序后的a,也就是说排序过程改变a,这是特点。
# sorted(a)等价与a.sort()
# np.argsort(),索引对于数的位置,第一位是9,表面最小的数是在第十位,第二位是1,对于第二位的数
# print(distance)
>>> a=np.random.randint(0,6,size=10)
>>> a
array([5, 4, 1, 5, 0, 0, 3, 4, 5, 3])
>>> np.argsort(a,axis=-1,kind='quicksort',order=None)
array([4, 5, 2, 6, 9, 1, 7, 0, 3, 8], dtype=int64)
>>> a[np.argsort(a)]
array([0, 0, 1, 3, 3, 4, 4, 5, 5, 5])
np.argsort(a,axis=-1,kind='quicksort',order=None)
对矩阵a重新排序,返回排序后的索引,a本身不变
>>> a
array([5, 4, 1, 5, 0, 0, 3, 4, 5, 3])
set()函数
set()函数是python中的内置函数,在选择其中可能出现数据的时候也会对这些数排序,默认是由小到大排序。
而且得到的数据是不会改变原始数据的。
以决策树选取划分阈值为例。
不用set().时,需先读取当前特征的数据。当然不希望改变这个数据。否则会导致当前特征数据被打乱而其他特征没有跟着变化。
需要用到copy()函数。
if self.wc(feat):
features = self._x.T(feat).copy()
features = np.sort(features)
_tar_set = (features[:-1] + features[1:]) / 2
如果用set():
if self.wc[feat]:
features = set(self._x.T[feat])
features = np.array(list(features), dtype=float) # set没法遍历
tar_set = (features[:-1] + features[1:]) / 2
copy()函数可能会增加时间开销,而set() 函数也会增加时间开销,比之np.sort()。但是np.sort()对重复出现的数据 fan反复运算,其实这样更差。