Numpy 索引参数与整数数组排序,同时保留排序顺序

问题描述 投票:0回答:1

我有一个数组

x
和arg排序的结果
i
。我需要根据
x
y
(和
i
,这里不相关)进行数百次排序。因此,不可能对数据进行两次排序,一切都需要通过初始排序来实现
i
。 如果我采用
x[i]
,它会按预期返回排序后的
x
。但是,我现在只想通过
x
使用
n
的某些行。因此
x[n]
按预期返回
x
的值。 我的问题是我需要通过
x[n]
对这些
i
进行排序(并且必须对
y[n]
做同样的事情。

# Example data
x = np.array([14, 15,  9,  6, 19, 18,  4, 11, 10,  0])
i = np.argsort(x)
n = np.array([2, 5, 7, 8])

#x[n] -> array([ 9, 18, 11, 10])

所需输出:

index_sort(x, n, i) = array([ 9, 10, 11, 18])

一些简单(失败)的尝试:

x[n][i]
-> 索引错误,因为 x 现在太小了。
x[i[n]] -> array([ 6, 11, 15, 18])
,已排序,但包含错误数据
x[i][n]
-> 相同

python numpy sorting indexing np.argsort
1个回答
0
投票

尝试仅根据

x[n]
i
进行排序不会更有效。

i
为您提供最终数组以及
x
中的位置,从中获取值以进行排序。

这意味着您无法使用

i
索引
n

我真的想根据

x[n]
i
进行排序,您需要确定与
i
匹配的
n
的位置,然后据此重新排序:

out = x[n][np.argsort(i[np.isin(i, n)])]
# array([ 9, 10, 11, 18])

效率最高的就是最有可能排序的

x[n]
:

out = np.sort(x[n])

或者,要重复该过程,首先索引,然后

argsort
,您可以重复使用
i

i = np.argsort(x[n])
# array([0, 3, 2, 1])

out = x[n][i]
# array([ 9, 10, 11, 18])
© www.soinside.com 2019 - 2024. All rights reserved.