我想检查一下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
它有效吗?
答案 0 :(得分:4)
你可以做 -
((x == y) & (x==1.0)).sum()
如问题所述,输入数组只包含0
和1.0
,所以你也可以这样做 -
((x + y)==2.0).sum()
与浮点值进行比较时请小心。因此,为了安全起见,可以引入tolerance
值。
答案 1 :(得分:2)
如果你不介意在过大的数组中舍入错误,那么(v * w).sum()
将是最明显的答案。如果您使用bool
的数组作为Veedrac评论,那么也不会出现舍入错误。
答案 2 :(得分:1)
vanilla Python解决方案是使用zip
和sum
。在这里,我假设一个布尔数组,我认为这更合适。
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))
,则可以进行推广。