2017-06-14 46 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

我想編寫一個函數,就像你寫的第一個函數一樣,但是想知道是否可以像第二個函數或前一個答案那樣以更高效/快速的方式完成。謝謝 –

相關問題