检查2列表中有多少个值相等

时间:2016-01-26 13:37:59

标签: python arrays numpy

我想检查一下2列表中有多少元素相等。

等于=在同一位置的相同值

我比较2个相同长度的列表,只有1.0或0.0。我只想算1.0。

我的问题是,我得到的不是正确的价值观。  例如:

import numpy as np
a=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0]
b=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0]

x=np.array(a)
y=np.array(b)

c=np.sum(a==b)

c2=np.sum(x==b)

print c,c2

#c=0 and c2= 113

其实不是真的,它是7. np.count_nonzero()也没有用。

现在我这样做:

c=0
for i in range(len(x)):
    if x[i]==1.0 and y[i] ==1.0:
        c+=1

但这显然极其缓慢,因为我有一个很大的数据集。

但是:

v=np.array([1.0,0.0,0.0,1.0])
w=np.array([1.0,0.0,1.0,1.0])

print np.sum(v==w)
# result is 3

它有效吗?

3 个答案:

答案 0 :(得分:4)

你可以做 -

((x == y) & (x==1.0)).sum()

如问题所述,输入数组只包含01.0,所以你也可以这样做 -

((x + y)==2.0).sum()

与浮点值进行比较时请小心。因此,为了安全起见,可以引入tolerance值。

答案 1 :(得分:2)

如果你不介意在过大的数组中舍入错误,那么(v * w).sum()将是最明显的答案。如果您使用bool的数组作为Veedrac评论,那么也不会出现舍入错误。

答案 2 :(得分:1)

vanilla Python解决方案是使用zipsum。在这里,我假设一个布尔数组,我认为这更合适。

sum = 0
for (i,j) in zip(v,w):
    if i and j:
        sum += 1

或者更紧凑的理解:

sum(i and j for (i,j) in zip(v,w))

以下是一个例子:

v = np.array([True, True, True])
w = np.array([True, False, True])
sum(i and j for (i,j) in zip(v,w))
# 2

如果您的数据无法更改为sum(i == j == 1.0 for (i,j) in zip(v,w)),则可以进行推广。