【发布时间】: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
我需要比较两个仅由 0 和 1 组成的数组:
A = [0,1,0,0,1]
B = [1,1,0,0,1]
我想获取不等于的元素数量和百分比,我尝试了以下代码:
print(numpy.mean(A == B))
但有时当某些元素相等时我得到 0...
【问题讨论】:
标签: python arrays arraylist compare
要获得两个列表索引中不相等的元素数量,您可以这样做:
noneq = sum(i==j for i, j in zip(A, B))
要得到百分比,你可以简单计算noneq/len(A)或noneq/len(B)
【讨论】:
sum(i==j for i, j in zip(A, B))(您的解决方案)比sum([i==j for i, j in zip(A, B)])(相同,但创建并汇总了一个列表)更快,但是,从我执行的少数测试来看,它确实似乎相反.知道为什么吗?
您可以使用列表推导来创建索引中的值是否相等的列表,然后计算所述列表的平均值。
numpy.mean([x == y for x, y in zip(A, B)])
【讨论】:
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
【讨论】:
使用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
【讨论】:
虽然列表理解始终是最优雅的解决方案 - 在我看来也是美学上的 - 我发现以下方法稍微快一些:
def calc(v1, v2):
s = 0
for i, x in enumerate(v1):
s += x == v2[i]
return s / len(v1)
显然,在所有情况下,您都应该始终检查/注意如果 A 和 B 长度不同(例如,我刚刚分享的代码将返回 IndexError 如果 len(v1) > len(v2) ; 在这方面,zip 在不同版本的 python 中表现不同)
【讨论】:
A=[1,2,3,4]和B=[5,6,7],zip(A,B)只会返回3个元组(1, 5), (2, 6), (3, 7)。我认为默认行为在 3.10 中没有改变,但你可以传递一个参数 strict=True,如果它们的长度不同,它本质上会抛出一个异常