2列数组使用tiebreaker和Save Python numpy排名

时间:2014-04-04 21:09:15

标签: python arrays django numpy scipy

我需要能够基于单个列对数组进行排名,然后再次使用第二列作为基本关系,然后将这两个等级保存到数据库中

阵列:

array = np.array(
    [(70,3,100),
     (72,3,101),
     (70,2,102)], dtype=[
                  ('score','int8'),
                  ('tiebreaker','int8'),
                  ('row_id','int8')])
array['score'] = array([70, 72, 70], dtype=int8)

仅使用'得分'列将返回

(1,3,1)

然后使用'得分'进行第二次排名排名。和'决胜局'列

(2,3,1)

然后我想将这两个等级保存到数据库中,例如:

result1 = Result.objects.get(id=array[0]['row_id'])
result1.relative_rank = 1
result1.absolute_rank = 2
results.save()

1 个答案:

答案 0 :(得分:0)

您可以使用scipy.stats.rankdata,如下所示:

In [10]: a
Out[10]: 
array([(70, 3, 100), (72, 3, 101), (70, 2, 102)], 
      dtype=[('score', 'i1'), ('tiebreaker', 'i1'), ('row_id', 'i1')])

In [11]: from scipy.stats import rankdata

第一级:

In [12]: rankdata(a['score'], method='min').astype(int)
Out[12]: array([1, 3, 1])

第二级:

In [13]: rankdata(256*a['score'] + a['tiebreaker'], method='min').astype(int)
Out[13]: array([2, 3, 1])

第二级(256*a['score'] + a['tiebreaker'])中使用的值依赖于类型为int8的数据。

检查docstring以查看不同的method是否更适合第二级。如果你知道第二级别没有关系,那么方法并不重要。