【发布时间】:2016-03-08 01:06:40
【问题描述】:
numpy.argsort 返回一个排序列表来执行间接排序,但它似乎不接受用户定义的函数来比较两个元素。
我想知道如何根据与用户定义的函数的比较来获得排序列表。
就我而言,我有一个结果表:
a = [[1,2,3,5,6,7,8],[4,6,2,5,6,3,4],...]
我要比较的功能是:
def argMedian(A):
s = np.array([sum(A[:i+1]) for i in range(Nmentions)])
mid = float(s[Nmentions-1])/2
return np.argwhere(mid < s)[0][0]
def tieBreaking(A, B):
Ac = A
Bc = B
medA = argMedian(Ac)
medB = argMedian(Bc)
while medA == medB:
Ac[medA] -= 1
Bc[medB] -= 1
medA = argMedian(Ac)
medB = argMedian(Bc)
return 1 if medA > medB else -1
这是majority judgment 的实现。一个列表包含每个等级的投票数。如果两个列表之间的中位数相等,则删除两个列表的中位数投票,并再次测试中位数的比较。在这里,我认为索引 0 是最好的等级,索引 7 是最差的。
我需要进行间接排序,因为我想知道排名。
【问题讨论】:
-
该比较函数没有意义,因为您使用中位数作为列表中的索引,但值的中位数可能不是有效索引。此外,即使它有效,它也会改变你的列表,这可能不是你想要的。请描述您希望如何对列表进行排序。
-
嗯,我认为只要所有值都不相等,中位数的上限就提供了一个有效的索引,不是吗?为了避免改变列表,我应该先复制它们吗?这个想法是从多数判断实现平局算法:en.wikipedia.org/wiki/Majority_judgment#Example_application
-
如果您的列表是
[100, 200, 300],那么中位数的上限是 200,但 200 不是列表中的有效索引。 -
此外,该页面上描述的算法不涉及修改单个值(正如您似乎试图通过从某些值中减去 1 来做的那样)。相反,它从投票列表中删除值。
-
对。我已经更新了实现并带来了更多关于上下文的信息