使用预先排序的数组排序

时间:2014-06-25 19:35:39

标签: arrays algorithm sorting ranking decision-tree

我正在构建决策树算法。在这个算法中排序是非常昂贵的,因为每次拆分我需要对每列进行排序。所以在开始时 - 甚至在树构建之前我都在预先设定变量 - 我创建了一个矩阵,因此矩阵中的每一列都保存了它的排名。然后,当我想在一些分割中对变量进行排序时,我实际上并没有对它进行排序,而是使用预先排序的排序数组。问题是我不知道如何以节省空间的方式做到这一点。

下面是一个天真的解决方案。这仅适用于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.])

基本上我有两个问题:

  1. 创建排名数组需要进行双重排序吗? (#1和#2)
  2. 在第3行中,我分配array[N]。这在空间方面非常无效,因为即使分割尺寸n <&lt;&lt; N我必须分配整个数组。这里的问题是如何计算rankperm_split。在示例原始rankperm_split = [1,9,2,3,4]中,它应该是[1,5,2,3,4]。这个问题可以重新制定,以便我想创建一个密集的&#34;整数数组,其最大间隙为1,它保持数组的排名不变。
  3. 更新

    我认为第二点是关键点。此问题可以重新定义为

    A[N] - 大小为N的数组 B[N] - 大小为N的数组

    我想将数组A转换为数组B,以便:

    1. 元素的排名保持不变(对于每对i,j如果A[i] < A[j]B[i] < B[j]
    2. 数组B只有1到N的元素,其中每个元素都是唯一的。
    3. 这种转变的一些例子:

      • [3,4,5] =&gt; [1,2,3]
      • [30,40,50] =&gt; [1,2,3]
      • [30,50,40] =&gt; [1,3,2]
      • [3,4,50] =&gt; [1,2,3]

      一个天真的实现(带排序)可以这样定义(在Python中)

      def remap(a):
          a_ = sorted(a)
          b = [a_.index(e)+1 for e in a]
          return b
      

0 个答案:

没有答案