2016-01-26 32 views
1

我想檢查兩個列表中有多少個元素相等。檢查2個列表中有多少個值相等

的Equals手段=在相同的位置

相同值I進行比較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()也didnt工作。

我現在正在做這樣的:

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

但這obvioulsy極度緩慢,因爲我有一個大的數據集。

但:

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

你可以使用'zip',它比Python更像是一個Python結構,而不是一個numpy。 – erip

+2

爲什麼你有一個只有'1.0'或'0.0'的花車矢量。爲什麼不使用'bool's? – Veedrac

回答

4

你可以這樣做 -

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

正如在問題中提到的輸入數組只持有01.0,所以你也可以這樣做 -

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

對一比較時,請小心浮點值。所以,爲了安全起見,可以引入價值。

+2

我會認爲'(x == 1.0)&(y == 1.0)'會更快。 – Veedrac

+0

有人可以解釋爲什麼按位「和」運算符? –

+0

@ cricket_007因爲你想確保問題中提到的輸入數組中的值都是'1.0'。 – Divakar

1

香草蟒解決方案是使用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))這可以推廣。

+1

對於記錄來說,對於布爾值,「i和j」只相當於「i == j == True」。它只是檢查真值,而不是嚴格的平等 –

+0

@ cricket_007確實如此。 – erip

2

如果你不介意在過大的數組中舍入錯誤,那麼(v * w).sum()將是最明顯的答案。如果您使用Veedrac評論的bool數組,則不會有舍入錯誤。

+2

用'.dot()'更快,我認爲:'x.dot(y)'。 – Divakar