查找排序数组中元素的位置

时间:2018-11-23 07:51:12

标签: python numpy

假设我有一些numpy数组(所有元素都是唯一的),我想按降序排序。我需要找出初始数组的哪些位置将在排序数组中。

示例。

In1: [1, 2, 3] # Input

Out1: [2, 1, 0] # Expected output

In2: [1, -2, 2] # Input

Out2: [1, 2, 0] # Expected output

我尝试了这个:

def find_positions(A):
    A = np.array(A)
    A_sorted = np.sort(A)[::-1]
    return np.argwhere(A[:, None] == A_sorted[None, :])[:, 1]

但是,当输入数组很大(len> 100000)时,它将不起作用。我做错了什么以及如何解决?

2 个答案:

答案 0 :(得分:2)

方法1

我们可以使用double argsort-

np.argsort(a)[::-1].argsort() # a is input array/list

方法2

我们可以使用一个argsort,然后使用数组分配-

# https://stackoverflow.com/a/41242285/ @Andras Deak
def argsort_unique(idx):
    n = idx.size
    sidx = np.empty(n,dtype=int)
    sidx[idx] = np.arange(n)
    return sidx

out = argsort_unique(np.argsort(a)[::-1])

答案 1 :(得分:0)

看看numpy.argsort(...)函数:

  

返回将对数组进行排序的索引。

     

使用kind关键字指定的算法沿给定的轴执行间接排序。它会沿给定轴按排序顺序返回与该索引数据形状相同的索引数组。

Here是该文档的参考,下面是一个简单的示例:

import numpy
arr = numpy.random.rand(100000)
indexes = numpy.argsort(arr)

indexes数组将包含对数组arr进行排序的所有索引