避坑:np.logical_and()不报错,但是结果全0

阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!

问题描述

function:np.logical_and()函数

bug:机器学习时算混淆矩阵TP、FP、FN、TN时,想对传入的连个array里面先分布进行每个元素值的判断,再进行and操作,不报错但结果分别为0

code:

import numpy as np
train_set_y     = [0,1,0,1,1,1,0]                #训练集样本标注
train_predict_y = [0,1,0,1,1,1,1]                #训练集预测标注

TP = np.sum(np.logical_and(train_set_y==1, train_predict_y_class==1))    
FP = np.sum(np.logical_and(train_set_y==0, train_predict_y_class==1))
FN = np.sum(np.logical_and(train_set_y==1, train_predict_y_class==0))
TN = np.sum(np.logical_and(train_set_y==0, train_predict_y_class==0))
print(f'TP = {TP}, FP = {FP}, TN = {TN}, FN = {FN}')

output:

TP = 0, FP = 0, TN = 0, FN = 0

很明显结果不对,这里明显结果应该为:

TP = 4, FP = 1, TN = 2, FN = 0

原因分析

打印调试后:

import numpy as np
train_set_y     = [0,1,0,1,1,1,0]                #训练集样本标注
train_predict_y = [0,1,0,1,1,1,1]                #训练集预测标注

TP = np.sum(np.logical_and(train_set_y==1, train_predict_y==1))
print(np.logical_and(train_set_y==1, train_predict_y==1))  

FP = np.sum(np.logical_and(train_set_y==0, train_predict_y==1))
print(np.logical_and(train_set_y==0, train_predict_y==1))  

FN = np.sum(np.logical_and(train_set_y==1, train_predict_y==0))
print(np.logical_and(train_set_y==1, train_predict_y==0))  

TN = np.sum(np.logical_and(train_set_y==0, train_predict_y==0))
print(np.logical_and(train_set_y==0, train_predict_y==0))  
print(f'TP = {TP}, FP = {FP}, TN = {TN}, FN = {FN}')  

output:

False
False
False
False
TP = 0, FP = 0, TN = 0, FN = 0

分析:

这里每次np.logical_and()执行后竟然只有一个False; 问题就在这里:
因为train_set_y、train_predict_y类型都是list,自然没法==1。
盲猜是因为list != int


解决方案1

官网文档:
在这里插入图片描述

可以看到里面除了传list以外,还可以传ndarray

关于list 和 ndarray 分不清的,可以看之前我的另一篇:《Numpy及list与array对比》

解决办法:

不传list,传ndarray

故代码如下:

import numpy as np
train_set_y     = np.array([0,1,0,1,1,1,0])                #训练集样本标注
train_predict_y = np.array([0,1,0,1,1,1,1])                #训练集预测标注

TP = np.sum(np.logical_and(train_set_y==1, train_predict_y==1))
print(np.logical_and(train_set_y==1, train_predict_y==1))  

FP = np.sum(np.logical_and(train_set_y==0, train_predict_y==1))
print(np.logical_and(train_set_y==0, train_predict_y==1))  

FN = np.sum(np.logical_and(train_set_y==1, train_predict_y==0))
print(np.logical_and(train_set_y==1, train_predict_y==0))  

TN = np.sum(np.logical_and(train_set_y==0, train_predict_y==0))
print(np.logical_and(train_set_y==0, train_predict_y==0))  
print(f'TP = {TP}, FP = {FP}, TN = {TN}, FN = {FN}')

output:

[False  True False  True  True  True False]
[False False False False False False  True]
[False False False False False False False]
[ True False  True False False False False]
TP = 4, FP = 1, TN = 2, FN = 0

可见结果争取了。那为何传ndarray就可以了呢?

还记得numpy的广播操作吗。盲猜这里一定是把==1中的1 广播成具有相同维度的ndarray,从而实现每个元素是否==1的判断


解决方案2

那非要传入list怎么办呢,那就不用numpy的函数,直接暴力for循环呗:

import numpy as np
train_set_y     = [0,1,0,1,1,1,0]                #训练集样本标注
train_predict_y = [0,1,0,1,1,1,1]                #训练集预测标注

TP = 0
FP = 0
FN = 0
TN = 0
for i,j in zip(train_set_y, train_predict_y):    #这里传入的是list,当然传入ndarray也可以
    if i==1 and j==1:
        TP += 1
    elif i==0 and j==1:
        FP += 1
    elif i==1 and j==0:
        FN += 1
    elif i==0 and j==0:
        TN += 1

print(f'TP = {TP}, FP = {FP}, TN = {TN}, FN = {FN}')

output:

TP = 4, FP = 1, TN = 2, FN = 0

总结:

1、np.logical_and()如果想对传入的连个array里面先分布进行每个元素值的判断,再进行and操作的话,必须要传入ndarray,否则结果错误;
2、for既可以传list,也可以传ndarray,因为两者都是可迭代的对象

码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `np.logical_and` 是 Numpy 中的一个函数,用于对两个布尔型数组进行逻辑与操作。它的用法是: ``` np.logical_and(x1, x2) ``` 其中 `x1` 和 `x2` 是两个布尔型数组。该函数会对 `x1` 和 `x2` 中对应位置的元素进行逻辑与操作,并返回一个新的布尔型数组。 例如: ``` import numpy as np x1 = np.array([True, False, True, False]) x2 = np.array([False, False, True, True]) result = np.logical_and(x1, x2) print(result) #输出 [False, False, True, False] ``` 这里x1,x2 的维度必须相同,如果不同会报错。 ### 回答2: np.logical_and是numpy库中的一个函数,用于实现逻辑与操作。它接受两个数组作为输入,并返回一个新的布尔数组。 这个函数的用法非常简单。它将逐元素地比较两个数组的对应元素,并在两个元素都为True时返回True,否则返回False。 例如,我们有两个数组arr1和arr2,它们的元素分别为[True, False, True]和[False, True, True]。我们可以使用np.logical_and(arr1, arr2)来执行逻辑与操作。 执行这个函数后,返回的结果将是一个新的布尔数组[False, False, True]。这是因为只有在两个数组对应的元素都为True时,结果才为True。 np.logical_and函数也可以同时比较多个数组。只需将所有要比较的数组作为参数传递给函数即可。例如,如果我们有三个数组arr1、arr2和arr3,分别为[True, False, True]、[False, True, True]和[True, True, False],我们可以使用np.logical_and(arr1, arr2, arr3)来执行逻辑与操作。 执行这个函数后,返回的结果将是一个新的布尔数组[False, False, False]。这是因为只有在所有数组对应的元素都为True时,结果才为True。 总结来说,np.logical_and用于实现逻辑与操作,对两个或多个数组中对应元素进行比较,并返回一个新的布尔数组,表示每个元素是否都为True。 ### 回答3: np.logical_and是NumPy库中用于逻辑与操作的函数。它接受两个参数并返回一个布尔数组,该数组对应于两个输入数组中对应元素进行逻辑与操作的结果。 函数的用法如下: np.logical_and(arr1, arr2) 其中,arr1和arr2是两个输入数组,可以是一维或多维数组。 函数返回的布尔数组的形状与输入数组相同,其中的每个元素是对应位置上arr1和arr2中元素进行逻辑与运算的结果,返回True表示逻辑与成立,返回False表示逻辑与不成立。 当输入数组维度不一致时,函数会尝试将输入数组广播到相同的形状,以便进行逻辑与操作。 例如,考虑以下示例: arr1 = np.array([True, True, False, False]) arr2 = np.array([True, False, True, False]) result = np.logical_and(arr1, arr2) 输出结果将是: [True, False, False, False] 在这个例子中,arr1和arr2的第一个元素都是True,所以对应位置的结果也是True。而在arr1和arr2的第二个元素中,只有arr2的元素是False,所以对应位置的结果是False。 可以通过逻辑与操作来实现一些常见的操作,比如筛选数组中满足特定条件的元素。在这种情况下,可以将逻辑与操作应用于两个条件的布尔数组之间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值