Algorithm 排序:返回一个数组,其中包含每个元素的新位置

Algorithm 排序:返回一个数组,其中包含每个元素的新位置,algorithm,sorting,Algorithm,Sorting,我需要对数组进行排序,同时返回一个包含原始元素排序位置的数组。(注意:不是argsort,是对数组进行排序的索引) 目前,这需要两个步骤: 阿格索特 新阵列上的散射操作 i、 e.pos[argsort[i]]=i 我觉得我错过了一个技巧。这是一个众所周知的算法,我忽略了,可以实现一步 第2步也可以通过搜索实现,但我认为分散更有效 我已经包含了一些示例python代码来说明这个问题 import numpy as np l = [0,-8,1,10,13,2] a = np.argsort(

我需要对数组进行排序,同时返回一个包含原始元素排序位置的数组。(注意:不是argsort,是对数组进行排序的索引)

目前,这需要两个步骤:

  • 阿格索特
  • 新阵列上的散射操作 i、 e.pos[argsort[i]]=i
  • 我觉得我错过了一个技巧。这是一个众所周知的算法,我忽略了,可以实现一步

    第2步也可以通过搜索实现,但我认为分散更有效

    我已经包含了一些示例python代码来说明这个问题

    import numpy as np
    
    l = [0,-8,1,10,13,2]
    
    a = np.argsort(l)
    # returns [1 0 2 5 3 4], the order required to sort l
    
    # init new list to zero
    pos = [0 for x in range(0,len(l))]
    
    # scatter http://en.wikipedia.org/wiki/Gather-scatter_(vector_addressing)
    for i in range(0,len(l)):
            pos[a[i]] = i
    
    print pos
    # prints [1, 0, 2, 4, 5, 3], i.e. each original indexes new position in the sorted array
    
    查找有关此问题的参考文献让我感到沮丧,可能是因为我缺少此类操作的正确术语


    任何帮助或指导都将不胜感激。

    这里是一个简单的实现,尽管它没有任何意义上的“到位”。我不确定你所说的“就地”是什么意思,因为输出是int类型的np.array,输入可以包含双精度

    根据@norio的评论进行更新,并澄清意图:

    #!/usr/bin/env python
    
    import numpy as np
    
    unsorted = np.array([0,-8,1,10,13,2])
    
    def myargsort(numbers):
      tuples = enumerate(numbers) # returns iterable of index,value
      sortedTuples = sorted(tuples,key = lambda pair: pair[1])
      sortedNumbers = [num for idx,num in sortedTuples]
      sortIndexes   = [idx for idx,num in sortedTuples]
      return (sortedNumbers,sortIndexes)
    
    sortedNums, sortIndices = myargsort(unsorted)
    
    print(unsorted)
    print(sortedNums)
    print(sortIndices)
    

    我以前做过几次,甚至不知道有人决定称之为聚集-分散的琐碎转换。尽管如此,我还是不明白你为什么如此执着于原始元素的排序位置是由argsort给出的。您的代码打印已排序元素的原始位置。还请注意,您可以通过两次应用
    argsort
    函数来实现相同的效果,但这显然是错误的suboptimal@Alexander我之所以考虑这个问题,是因为我觉得结果(排序元素的新位置)可以在排序过程中计算到位。它似乎相当基本,所以我认为它可能有一个众所周知的解决方案。我正在尝试优化一个算法的性能,该算法包含在GPU上运行的上述步骤。看起来这个方法需要两次排序操作。原来的方法看起来效率更高,因为它需要一次排序操作和一次列表遍历。@norio,不确定三年前我到底在想什么,但回顾最初的问题,我怀疑我的版本是否真的实现了他想要的,这可能是你的观点。虽然只有一种排序,但有一个聚集操作将结果应用于数字列表。我不知何故将以前版本中的
    print(…)
    中的
    np.argsort
    误认为是算法的一部分。这就是我写“排序操作两次”的原因。我很抱歉。我撤回上述评论。(关于上一个函数的输出与OP想要的结果之间的差异,您是对的,但我太粗心了,没有注意到。)我仍然认为您的
    sortedindice
    np.argsort(unsorted)
    ,这不是OP想要的。。。