我有一个数组
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]
-> 相同
尝试仅根据
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])