Python 在排序的数组中查找np数组的ID(或索引),其中可能包含重复的元素

Python 在排序的数组中查找np数组的ID(或索引),其中可能包含重复的元素,python,numpy,sorting,np.argsort,Python,Numpy,Sorting,Np.argsort,我有一个一维numpy阵列 x=np.array([0.1,0.3,0.2,0.4,0.5,0.4]) 我需要计算另一个大小相同的数组,其中每个元素都是排序数组中的ID(或称为索引)。这里的排序数组将是[0.1,0.2,0.3,0.4,0.5]。因此,0.1对应于ID 0;0.2对应于ID 1;。。。0.5对应于ID 4。预期结果将是 [0,2,1,3,4,3] 请注意,此问题类似于,但不同于 因为我们需要处理重复元素。您可以使用: 输出(out): 也就是说,通常应该避免使用唯一的

我有一个一维numpy阵列

x=np.array([0.1,0.3,0.2,0.4,0.5,0.4])
我需要计算另一个大小相同的数组,其中每个元素都是排序数组中的ID(或称为索引)。这里的排序数组将是[0.1,0.2,0.3,0.4,0.5]。因此,0.1对应于ID 0;0.2对应于ID 1;。。。0.5对应于ID 4。预期结果将是

    [0,2,1,3,4,3]
请注意,此问题类似于,但不同于 因为我们需要处理重复元素。

您可以使用:

输出(
out
):

也就是说,通常应该避免使用唯一的浮动。

只需使用

将numpy导入为np
x=np.数组([0.1,0.3,0.2,0.4,0.5,0.4])
>>>索引=np.argsort(x)
>>>索引
数组([0,2,1,3,5,4])
试试看:


按排序顺序输出唯一的项。

但是如何获得
np.array([0.1,0.2,0.3,0.4,0.5])
?啊,很好。A认为这是一个单独的数组。好的,我可以用输入数组的
np.unique
替换它。这是我最初的想法。但是后来我意识到
np.unique
return\u inverse=True
:-)不,这不是OP想要的。我接受了这个,因为它似乎比mathfux提出的更有效(也很好)。
uniques, out = np.unique(x, return_inverse=True)
array([0, 2, 1, 3, 4, 3])
>>> x = np.array([0.1,0.3,0.2,0.4,0.5,0.4])
>>> np.searchsorted(np.unique(x), x)
array([0, 2, 1, 3, 4, 3], dtype=int32)