是否有Python的內置函數python.array
argsort()
在numpy.array
上做了什麼?基本python中Numpy.argsort()的等價物?
回答
我計時上述建議,這裏是我的結果。
首先,功能:
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
沒有內置的功能,但它很容易組裝一個出了了不起的工具的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
S也是一樣的方法:
import array
x = array.array('d', [5, 2, 1, 10])
print(argsort(x))
# [2, 1, 0, 3]
+1非常Python化! – katrielalex 2010-08-01 15:07:25
而不是使用(理論上是私人的)__getitem__,你也可以使用'operator.itemgetter' /'operator.attrgetter' http://docs.python.org/library/operator.html – Ender 2010-08-01 17:58:46
如果'operator.itemgetter'可以是用作'__getitem__'的嵌入式替代品,我認爲我已經同意了你的Ender,但據我所知,'operator.itemgetter'也需要將其封裝在'lambda'表達式中。如果可以的話,我寧願避免額外的'lambda'。 – unutbu 2010-08-01 19:57:25
我的替代與枚舉:
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 sort without lambda expressions
[i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
發現了這個問題,但需要argsort爲對象的列表基於一個對象屬性。
擴展unutbu的答案,這將是:
sorted(range(len(seq)), key = lambda x: seq[x].sort_property)
- 1. Python的等價物@
- 2. Python等價物repr()?
- 3. Sinatra的Python等價物
- 4. 'pat2cwav'的Python等價物
- 5. Python等價物的matlab corr2
- 6. Python的等價物__setitem__
- 7. Python的等價物find2perl
- 8. Python的等價物D3.js
- 9. numpy(Python)中的matlab'ismember'的等價物?
- 10. R中的Python「json.dumps()」的等價物?
- 11. Perl「import os」Python等價物?
- 12. python中'gem'的等價物是什麼?
- 13. Python中的遍歷等價物?
- 14. Python中imadjust的等價物是什麼?
- 15. OkHttp中的HTTPBasicAuth(python)等價物(Android)
- 16. 在C#中的默認Python等價物#
- 17. 在Python中set -o pipefail的等價物?
- 18. python中print_r()的等價物是什麼?
- 19. 基於文件的java.util.concurrent.locks.Lock的等價物?
- 20. 在Python中是否有sessionInfo()等價物?
- 21. 在Python中是否有Rake等價物?
- 22. Python的等價物的PHP的虛擬()
- 23. perldb中的'x'等同於emacs中python的pdb的等價物?
- 24. Python的for Ruby的等價物
- 25. Python的等價物Ruby的each_slice(count)
- 26. Python的等價物的MATLAB psf2otf函數
- 27. 什麼是Python的os.walk的等價物?
- 28. Python的等價物Matlab的持續
- 29. Python的等價物的#ifdef DEBUG
- 30. Java的等價物Python的str.strip()。split()?
有趣的 - 可能平均值比3的最佳值更重要?? – JPH 2013-02-26 11:02:57
平均值受到異常值的影響。您不希望結果被其他程序運行或硬件緩存未命中所污染happenstances。 – 2017-08-03 20:47:51