我最近使用了这两个函数,并希望听取任何人对以下问题的意见:
- argsort和rankdata在其用途上有根本区别吗?
- 它们之间是否存在性能优势?(特别是:大型数组和小型数组的性能差异?)
- 导入rankdata的内存开销是多少?
提前感谢。
p.s. 我无法创建新标签'argsort'或'rankdata'。如果有任何拥有足够地位的人觉得它们应该添加到此问题中,请添加。
argsort和rankdata在目的上有根本的区别吗?
在我看来,它们略有不同。第一个会给你数据排序后的位置,而第二个是数据的排名。在存在并列的情况下,这种差异可能会变得明显:
import numpy as np
from scipy import stats
a = np.array([ 5, 0.3, 0.4, 1, 1, 1, 3, 42])
almost_ranks = np.empty_like(a)
almost_ranks[np.argsort(a)] = np.arange(len(a))
print(almost_ranks)
print(almost_ranks+1)
print(stats.rankdata(a))
结果为(注意 3. 4. 5
和 4. 4. 4
的区别):
[6. 0. 1. 2. 3. 4. 5. 7.]
[7. 1. 2. 3. 4. 5. 6. 8.]
[7. 1. 2. 4. 4. 4. 6. 8.]
argsort
平均需要1.7微秒,而 rankdata
则需要53.9微秒,这之间的差距相当大;当涉及到一个包含1,000,000个整数的数组时,argsort
的效率大约高出30%(73.5毫秒对比107毫秒)。 - undefined
rankdata
的代码。它首先做的事情之一是argsort
。但它并不只是简单地返回排序结果。你要排序的是什么类型的数据? - hpauljargsort
本身不进行排名。有关使用argsort
或rankdata
进行排名的更多信息,请参见此问题和答案。 - Warren Weckesserargsort
进行排名的高效方法。除了从0开始而不是1之外,它提供了与rankdata(x, method='ordinal')
相同的排名。如果这是您需要的排名方式,那么请使用接受的答案中的argsort
方法-它比rankdata
少一些开销,因此速度会更快。(请注意,它将以不同的方式处理重复值。)如果您不想实现自己的排名函数,或者需要它提供的其他排名方法之一,则rankdata
非常好用。 - Warren Weckesser