【问题标题】:Python comparison element by elementPython逐元素比较
【发布时间】:2022-01-08 21:01:47
【问题描述】:

我需要比较两个仅由 0 和 1 组成的数组:

A = [0,1,0,0,1]
B = [1,1,0,0,1]

我想获取不等于的元素数量和百分比,我尝试了以下代码:

print(numpy.mean(A == B))

但有时当某些元素相等时我得到 0...

【问题讨论】:

  • 您可以尝试自己迭代列表。

标签: python arrays arraylist compare


【解决方案1】:

要获得两个列表索引中不相等的元素数量,您可以这样做:

noneq = sum(i==j for i, j in zip(A, B))

要得到百分比,你可以简单计算noneq/len(A)noneq/len(B)

【讨论】:

  • 谢谢,我 +1。不过我有一个问题:我希望这个sum(i==j for i, j in zip(A, B))(您的解决方案)比sum([i==j for i, j in zip(A, B)])(相同,但创建并汇总了一个列表)更快,但是,从我执行的少数测试来看,它确实似乎相反.知道为什么吗?
  • @nikeros 看看关于这个in this thread的多个讨论
【解决方案2】:

您可以使用列表推导来创建索引中的值是否相等的列表,然后计算所述列表的平均值。

numpy.mean([x == y for x, y in zip(A, B)])

【讨论】:

    【解决方案3】:
    import numpy as np
    
    A = np.array([0,1,0,0,1])
    
    B = np.array([1,1,0,0,1])
    
    # number of
    (A!=B).sum() #1
    
    # percentage
    (A!=B).sum()*100 / A.size
    

    【讨论】:

      【解决方案4】:

      使用count_nonzero统计满足条件的元素个数

      A = np.array([0,1,0,0,1]) 
      B = np.array([1,1,0,0,1])
      print(np.count_nonzero((A==B) == True))
      

      百分比使用np.count_nonzero/shape

      【讨论】:

        【解决方案5】:

        虽然列表理解始终是最优雅的解决方案 - 在我看来也是美学上的 - 我发现以下方法稍微快一些:

        def calc(v1, v2):
            s = 0
            for i, x in enumerate(v1):
                s += x == v2[i]
            return s / len(v1)
        

        显然,在所有情况下,您都应该始终检查/注意如果 AB 长度不同(例如,我刚刚分享的代码将返回 IndexError 如果 len(v1) > len(v2) ; 在这方面,zip 在不同版本的 python 中表现不同)

        【讨论】:

        • Python 3.9.9 发生了什么?
        • @VincentSama 它将截断为最短的。换句话说,如果你通过A=[1,2,3,4]B=[5,6,7]zip(A,B)只会返回3个元组(1, 5), (2, 6), (3, 7)。我认为默认行为在 3.10 中没有改变,但你可以传递一个参数 strict=True,如果它们的长度不同,它本质上会抛出一个异常
        猜你喜欢
        • 2018-09-29
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 2020-04-07
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多