2017-06-14 89 views
0

我有3个与a1,a2,a3(其长度相等)具有相似浮点值的列表。有效的方法来比较Python中的3个列表的值?

for i in length(a1,a2,a3): 
    Find the increasing/decreasing order of a1[i], a2[i], a3[i] 
    Rank the values based on the order 

有没有简单/有效的方法来做到这一点?而不是写if-else语句块?

我想在Python中计算Friedman测试等级。虽然有一个scipy.stats.friedmanchisquare功能,它不会返回行列弗里德曼测试

编辑

我在Image 1这样的数据。

  • A1有一周1
  • A2有2周和
  • A3拥有每周3 我想排名就像这个Image 2

我尝试用,如果比较值的值像这样的其他环

for i in range(0,10): 
if(acc1[i]>acc2[i]): 
    if(acc1[i]>acc3[i]): 
     rank1[i] = 1 
     if(acc2[i]>acc3[i]): 
      rank2[i] = 2 
      rank3[i] = 3 
+0

这是什么意思“等级”?你想要什么样的输出? –

+0

请详细说明。你的问题似乎含糊不清,你也可以发布你已经尝试过的代码,以及你编写的代码的具体问题。 – amrx

+0

@Błotosmętek我想比较3个列表的相同索引中的值,并按递增顺序对它们进行排名。如果您对排名有进一步的问题,请参阅此视频https://www.youtube.com/watch?v=KbBn4A7VFMs –

回答

0

friedmanchisquare使用scipy.stats.rankdata。这里有一种方法可以将rankdata用于三个列表。它创建一个名为ranks的列表,其中ranks[i]是包含排名[a1[i], a2[i], a3[i]]的数组。

In [41]: a1 
Out[41]: [1.0, 2.4, 5.0, 6] 

In [42]: a2 
Out[42]: [9.0, 5.0, 4, 5.0] 

In [43]: a3 
Out[43]: [5.0, 6.0, 7.0, 2.0] 

In [44]: from scipy.stats import rankdata 

In [45]: ranks = [rankdata(row) for row in zip(a1, a2, a3)] 

In [46]: ranks 
Out[46]: 
[array([ 1., 3., 2.]), 
array([ 1., 2., 3.]), 
array([ 2., 1., 3.]), 
array([ 3., 2., 1.])] 

如果转换到一个numpy的数组,然后你可以很容易地与ranks无论是行或列的工作:

In [47]: ranks = np.array(ranks) 

In [48]: ranks 
Out[48]: 
array([[ 1., 3., 2.], 
     [ 1., 2., 3.], 
     [ 2., 1., 3.], 
     [ 3., 2., 1.]]) 

In [49]: ranks.sum(axis=0) 
Out[49]: array([ 7., 8., 9.]) 
+0

正是我要找的。谢谢 –

0

你可以定义一个简单的函数,返回的顺序种类:

def sort3(a,b,c): 
    if (a >= b): 
     if (b >= c): 
      return (1, 2, 3) 
     elif (a >= c): 
      return (1, 3, 2) 
     else: 
      return (3, 1, 2) 
    elif (b >= c): 
     if (c >= a): 
      return (2, 3, 1) 
     else: 
      return (2, 1, 3) 
    else: 
     return (3, 2, 1) 

或考虑使用这种https://stackoverflow.com/a/3382369/3224664

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__) 
a = [1,3,5,7] 
b = [2,2,2,6] 
c = [3,1,4,8] 
for i in range(len(a)): 
    print(argsort([a[i],b[i],c[i]])) 
+0

我想编写一个函数,就像你写的第一个函数一样,但是想知道是否可以像第二个函数或前一个答案那样以更高效/快速的方式完成。谢谢 –

相关问题