我正在构建决策树算法。在这个算法中排序是非常昂贵的,因为每次拆分我需要对每列进行排序。所以在开始时 - 甚至在树构建之前我都在预先设定变量 - 我创建了一个矩阵,因此矩阵中的每一列都保存了它的排名。然后,当我想在一些分割中对变量进行排序时,我实际上并没有对它进行排序,而是使用预先排序的排序数组。问题是我不知道如何以节省空间的方式做到这一点。
下面是一个天真的解决方案。这仅适用于1个varbe(v)和1个split(split_ind)。
import numpy as np
v = np.array([60,70,50,10,20,0,90,80,30,40])
sortperm = v.argsort() #1 sortperm = array([5, 3, 4, 8, 9, 2, 0, 1, 7, 6])
rankperm = sortperm.argsort() #2 rankperm = array([6, 7, 5, 1, 2, 0, 9, 8, 3, 4])
split_ind = np.array([3,6,4,8,9]) # this is my split (random)
# split v and sortperm
v_split = v[split_ind] # v_split = array([10, 90, 20, 30, 40])
rankperm_split = rankperm[split_ind] # rankperm_split = array([1, 9, 2, 3, 4])
vsorted_dummy = np.ones(10)*-1 #3 allocate "empty" array[N]
vsorted_dummy[rankperm_split] = v_split
vsorted = vsorted_dummy[vsorted_dummy!=-1] # vsorted = array([ 10., 20., 30., 40., 90.])
基本上我有两个问题:
array[N]
。这在空间方面非常无效,因为即使分割尺寸n <&lt;&lt; N我必须分配整个数组。这里的问题是如何计算rankperm_split
。在示例原始rankperm_split = [1,9,2,3,4]
中,它应该是[1,5,2,3,4]
。这个问题可以重新制定,以便我想创建一个密集的&#34;整数数组,其最大间隙为1,它保持数组的排名不变。更新
我认为第二点是关键点。此问题可以重新定义为
A[N]
- 大小为N的数组
B[N]
- 大小为N的数组
我想将数组A转换为数组B,以便:
A[i] < A[j]
则B[i] < B[j]
这种转变的一些例子:
一个天真的实现(带排序)可以这样定义(在Python中)
def remap(a):
a_ = sorted(a)
b = [a_.index(e)+1 for e in a]
return b