Существует ли функция numpy для сортировки по вектору с индексами? - PullRequest
1 голос
/ 29 июня 2019

Я хочу отсортировать числовой вектор по другому числовому вектору с индексами.

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.])

Есть ли функция для этого? Что-то вроде обратного аргумента

Ответы [ 3 ]

4 голосов
/ 29 июня 2019

Это может быть сделано в 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
2 голосов
/ 29 июня 2019

Используйте 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.]

0 голосов
/ 29 июня 2019

Вы можете попробовать это:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...