我試圖盡可能簡單地表達這個問題,但我是 Python 新手,邏輯非常糟糕,所以我遇到了一些麻煩。基本上我想知道是否有一種更簡潔的方法來計算兩個一維布爾陣列的混淆矩陣。
這是一個例子:
arr1 = [0, 0, 1, 0, 1, 1]
arr2 = [1, 0, 0, 0, 1, 0]
tp = fp = tn = fn = 0
for i,p in enumerate(arr1):
a = arr2[i]
if p & a: tp = 1
if p & ~a: fp = 1
if ~p & ~a: tn = 1
if ~p & a: fn = 1
# This was pointed out to be incorrect (see Mozway's answer below)
我試過這個,但它只是增加了更多的行,看起來可能更糟:
if p == o:
if p: tp = 1
else: tn = 1
else:
if p: fp = 1
else: fn = 1
然后我嘗試添加嵌套條件運算式(我相信這些是 Python 版本的三元運算子?)但是這個令人作嘔的怪物甚至無法編譯:
(tp = 1 if a else fp = 1) if p else (tn = 1 if ~a else fn = 1)
任何幫助,將不勝感激!
編輯:對不起,我應該澄清一下,我想要的結果是這樣的:
添加print(tp, fp, tn, fn)將給出1, 2, 2, 1。簡單地計算陣列中每個布林值的組合。
uj5u.com熱心網友回復:
使用zip
和collections.Counter
:
from collections import Counter
c = Counter(zip(arr1, arr2))
tp = c[1,1]
fp = c[1,0]
tn = c[0,0]
fn = c[0,1]
print(tp, fp, tn, fn)
輸出:(1, 2, 2, 1)
柜臺:
print(c)
# Counter({(0, 1): 1, (0, 0): 2, (1, 0): 2, (1, 1): 1})
索引計數器的替代方法:
ids = {'tp': (1,1), 'fp': (1,0), 'tn': (0,0), 'fn': (0,1)}
c[ids['tp']]
# 1
為什么你的第一種方法失敗了
bool(~1)
is True
( ~1
is -2
),因此給出了錯誤的計數。~
在矢量設定中使用not
(例如使用 numpy),但在純 python 中不使用。您可以使用1-x
(not ~x
) 反轉“整數作為布林值”( 1-0
-> 1
; 1-1
-> 0
)。
純 python 中的~
and運算子的參考(你應該使用and )。它們的含義不同。&
not
and
numpy
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507877.html