我想根据另一个带有索引的numpy向量对numpy向量进行排序。
import numpy as np
my_vector = np.array([9. 6. 21. 17. 12.])
my_indices = np.array([1. 4. 2. 0. 3.])
what_i_want = np.array([17. 9. 21. 12. 6.])
是否有此功能?像逆向argsort这样的东西
答案 0 :(得分:4)
可以使用高级分配在O(n)中完成:
my_vector = np.array([9., 6., 21., 17., 12.])
my_indices = np.array([1., 4., 2., 0., 3.])
my_result = np.empty_like(my_vector)
my_result[my_indices.astype(int)] = my_vector
my_result
# array([17., 9., 21., 12., 6.])
有关较大示例的时间:
from timeit import timeit
a = np.random.random(1000000)
b = np.random.permutation(1000000).astype(float)
def fargsort():
return(a[b.argsort()])
def fassign():
c = np.empty_like(a)
c[b.astype(int)] = a
return c
np.all(fargsort() == fassign())
# True
timeit(fargsort,number=10)
# 1.2764090860000579
timeit(fassign,number=10)
# 0.17262099700747058
答案 1 :(得分:2)
按如下所示使用argsort
:
import numpy as np
my_vector = np.array([9., 6., 21., 17., 12.])
my_indices = np.array([1., 4., 2., 0., 3.])
print(my_vector[my_indices.argsort()])
输出:
[17。 9. 21. 12. 6。]
答案 2 :(得分:0)
您可以尝试以下方法:
import numpy as np
my_vector = np.array([9., 6., 21., 17., 12.])
my_indices = np.array([1., 4., 2., 0., 3.])
res_sorted = [x for _,x in sorted(zip(my_indices,my_vector))]
print(res_sorted)
输出:
[17.0, 9.0, 21.0, 12.0, 6.0]