есть встроенная функция Python, которая делает на python.array
то, что argsort()
делает на numpy.array
?
Эквивалент Numpy.argsort() в базовом питоне?
Ответ 1
Я приурочил приведенные выше предложения, и вот мои результаты.
Прежде всего, функции:
def f(seq):
# http://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python/3383106#3383106
#non-lambda version by Tony Veijalainen
return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
def g(seq):
# http://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python/3383106#3383106
#lambda version by Tony Veijalainen
return [x for x,y in sorted(enumerate(seq), key = lambda x: x[1])]
def h(seq):
#http://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python/3382369#3382369
#by unutbu
return sorted(range(len(seq)), key=seq.__getitem__)
Теперь сеанс IPython:
In [16]: seq = rand(10000).tolist()
In [17]: %timeit f(seq)
100 loops, best of 3: 10.5 ms per loop
In [18]: %timeit g(seq)
100 loops, best of 3: 8.83 ms per loop
In [19]: %timeit h(seq)
100 loops, best of 3: 6.44 ms per loop
FWIW
Ответ 2
Нет встроенной функции, но легко собрать один из потрясающих инструментов, доступных Python:
def argsort(seq):
# http://stackoverflow.com/questions/3071415/efficient-method-to-calculate-the-rank-vector-of-a-list-in-python
return sorted(range(len(seq)), key=seq.__getitem__)
x = [5,2,1,10]
print(argsort(x))
# [2, 1, 0, 3]
Он работает на Python array.array
так же:
import array
x = array.array('d', [5, 2, 1, 10])
print(argsort(x))
# [2, 1, 0, 3]
Ответ 3
Моя альтернатива с перечислением:
def argsort(seq):
return [x for x,y in sorted(enumerate(seq), key = lambda x: x[1])]
seq=[5,2,1,10]
print(argsort(seq))
# Output:
# [2, 1, 0, 3]
Лучше хотя бы использовать ответ из https://stackoverflow.com/users/9990/marcelo-cantos ответ на поток сортировать python без лямбда-выражений
[i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
Ответ 4
Нашел этот вопрос, но нужен argsort для списка объектов, основанных на свойстве объекта.
Расширение ответа unutbu:
sorted(range(len(seq)), key = lambda x: seq[x].sort_property)