亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找兩個數組之間的匹配項,并且第一個數組 == 1?

查找兩個數組之間的匹配項,并且第一個數組 == 1?

智慧大石 2022-07-05 15:49:21
我有兩個數組(y_true 和 y_pred),都由相同長度的 0 和 1 組成。我想要一種更有效/更快的方法來計算 y_pred == y_true 的次數以及 y_pred == 1 的次數。我對計算匹配的 0 不感興趣?,F在,我的函數看起來像這樣使用 for 循環:from sklearn.metrics.scorer import make_scorer# Make a custom metric functiondef my_custom_accuracy(y_true, y_pred):       # Bring in the arrays    good_matches = 0                          # Set counter to 0    for num, i in enumerate(y_pred):          # for each y_pred in array...        if i == y_true[num] & i == 1:         # if y_pred == y_true AND y_pred == 1...            good_matches += 1                 # count it as a good match    return float(good_matches / sum(y_true))  # return good matches as a % of all the 1's in y_true....它可以工作,但是 for 循環很慢而且效率不高。我希望利用這樣的東西:# Make a custom metric functiondef my_custom_accuracy(y_true, y_pred):    return float(sum(y_pred == y_true)) / sum(y_true)...簡單,但我不知道如何添加“& y_pred == 1”部分。有任何想法嗎?謝謝!
查看完整描述

2 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

如果數組還不是布爾值,請將它們設為布爾值。這可以通過視圖廉價地完成,或者更簡單地通過astype

y_pred = y_pred.astype(bool)
y_true = y_true.astype(bool)

如果數組已經是布爾值,或者它們真的永遠不會包含零和一,則可以省略此步驟。

現在good_matches只是

good_matches = np.sum(y_pred & y_true)

要了解為什么會這樣,請注意,除了明顯包含 之外y_pred == y_true,表達式只有在為真時才能y_pred為真,因此它根據運算符的定義自動暗示y_pref == 1and 。y_true == 1&

因此,您的最終結果是

np.sum(y_pred & y_true) / np.sum(y_true)

這也可以寫成

np.count_nonzero(y_pred & y_true) / np.count_nonzero(y_true)


查看完整回答
反對 回復 2022-07-05
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

您可以使用列表推導來檢查列表,同時過濾掉 y_pred == 0,然后通過將匹配項除以比較列表的長度來獲得準確性。


compare = [p == t for p, t in zip(y_pred, y_true) if p == 1]

accuracy = compare.count(True) / len(compare)

或者對于使用 numpy 的東西:


mask = np.where(y_true == y_pred)

matches = y_pred[mask]

accuracy = np.sum(matches) / len(matches)


查看完整回答
反對 回復 2022-07-05
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號