【问题标题】:Efficient way to compare the values of 3 lists in Python?在 Python 中比较 3 个列表的值的有效方法?
【发布时间】:2017-06-14 14:03:54
【问题描述】:

我在 a1、a2、a3 中有 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 中计算弗里德曼测试等级。虽然有一个 scipy.stats.friedmanchisquare 函数,但它不会返回排名弗里德曼测试

编辑

我在Image 1 中有这样的数据。

  • a1 有第 1 周
  • a2 有第 2 周和
  • a3 有第 3 周 我想对Image 2中的值进行排名

我尝试使用这样的 if else 循环来比较值

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

【问题讨论】:

  • 这里的“排名”是什么意思?你想要什么样的输出?
  • 请详细说明。您的问题似乎含糊不清,并且确实发布了您尝试过的内容以及您编写的代码的具体问题。
  • @Błotosmętek 我想比较 3 个列表的同一索引中的值,并按升序排列它们。如果您对排名有更多疑问,请参阅此视频youtube.com/watch?v=KbBn4A7VFMs
  • @amrx 添加了我目前编写的部分代码。

标签: python numpy scipy statistics


【解决方案1】:

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.])

【讨论】:

  • 正是我想要的。谢谢
【解决方案2】:

您可以定义一个返回排序顺序的简单函数:

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]]))

【讨论】:

  • 我想像您编写的第一个函数一样编写函数,但想知道是否可以像您的第二个函数或上一个答案那样以更有效/更快的方式完成。谢谢
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2021-01-14
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多