Python bool 和 numpy bool_ 的行为究竟有何不同?

2024-06-08

TLDR:is-comparison 适用于 Pythonbool且不适用于 numpybool_的。还存在其他差异吗?


几天前我遇到了布尔值的奇怪行为。当我尝试对这个 numpy 数组使用 is-comparison 时:

arr1 = np.array([1,0,2,0], dtype=bool)
arr1

Out[...]: array([ True, False,  True, False])

(这些变量名称纯属虚构,与真实变量名称或生产代码的任何相似之处纯属巧合)

我看到了这个结果:

arr1 is True

Out[...]: False

这是合乎逻辑的,因为arr1不是 True 或 False,它是 numpy 数组。我检查了这个:

arr1 == True

Out[...]: array([ True, False,  True, False])

这正如预期的那样。我提到这个可爱的行为并立即忘记了。第二天我检查了数组元素的真实性:

[elem is False for elem in arr1]

它返回给我这个!

Out[...]: [False, False, False, False]

我真的很困惑,因为我记得在Python数组中(我认为问题出在数组行为中):

arr2 = [True, False, True, False]
[elem is False for elem in arr2]

有用:

Out[...]: [False, True, False, True]

此外,它在我的另一个 numpy 数组中工作:

very_cunning_arr = np.array([1, False, 2, False, []])
[elem is False for elem in very_cunning_arr]

Out[...]: [False, True, False, True, False]

当我深入研究阵列时,我发现了这一点very_cunning_arr建造者:numpy.object因为有几个非数字元素,所以它包含 Python bools 和arr1建造者:numpy.bool_。所以我检查了他们的行为:

numpy_waka = np.bool_(True)
numpy_waka

Out[...]: True

python_waka = True
python_waka

Out[...]: True

[numpy_waka is True, python_waka is True]

我终于发现了区别:

Out[...]: [False, True]

在所有这些之后我有两个问题:

  1. Do numpy.bool_ and bool他们的共同行为还有其他差异吗? (我知道numpy.bool_有许多 numpy 函数和参数,例如.T和别的)
  2. 如何检查 numpy 数组是否只包含 numpy 布尔值,而不包含 Pythonic 布尔值?

(PS:是的,NOW我知道与 True/False 相比is不好):

不要使用 == 将布尔值与 True 或 False 进行比较。

Yes:   if greeting:
No:    if greeting == True:
Worse: if greeting is True:

Edit 1:正如中提到的另一个问题 https://stackoverflow.com/questions/18922407/boolean-and-type-checking-in-python-vs-numpy, numpy 有自己的bool_类型。但这个问题的细节有点不同:我发现 is 语句的工作方式不同,但在这种差异之前 - 是否还有其他不同的共同点bool_ and bool行为?如果是的话,具体是什么?


In [119]: np.array([1,0,2,0],dtype=bool)                                             
Out[119]: array([ True, False,  True, False])

In [120]: np.array([1, False, 2, False, []])                                         
Out[120]: array([1, False, 2, False, list([])], dtype=object)

注意数据类型。对于对象数据类型,数组的元素是 Python 对象,就像它们在源列表中一样。

在第一种情况下,数组数据类型是布尔值。这些元素代表布尔值,但它们本身并不是 PythonTrue/False对象。严格来讲Out[119]才不是contain np.bool_对象。Out[119][1]是类型bool_,但这就是“拆箱”的结果。它是什么ndarray当您请求一个元素时,就会产生索引。 (这种“拆箱”区别对于所有非对象数据类型都是正确的。)

通常我们不会创建dtype对象,偏好np.array(True),但要按照你的例子:

In [124]: np.bool_(True)                                                             
Out[124]: True
In [125]: type(np.bool_(True))                                                       
Out[125]: numpy.bool_
In [126]: np.bool_(True) is True                                                     
Out[126]: False
In [127]: type(True)                                                                 
Out[127]: bool

is这是一个严格的考验,不仅是对平等的考验,也是对身份的考验。不同类的对象不满足is测试。对象可以满足==测试不满足is test.

让我们来玩一下对象数据类型数组:

In [129]: np.array([1, False, 2, np.bool_(False), []])                               
Out[129]: array([1, False, 2, False, list([])], dtype=object)
In [130]: [i is False for i in _]                                                    
Out[130]: [False, True, False, False, False]

In the Out[129]显示,两个False对象显示相同,但Out[130]测试表明它们是不同的。


专注于您的问题。

  • np.bool_(False)是一个独特的对象,但不同于False。正如您所注意到的,它具有许多与np.array(False).

  • 如果数组数据类型是bool它不包含Pythonbool对象。它甚至不包含np.bool_对象。然而,索引这样的数组会产生一个bool_。并申请item()进而产生一个Pythonbool.

  • 如果数组对象 dtype,它很可能包含 Pythonbool,除非您已采取特殊步骤来包括bool_对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python bool 和 numpy bool_ 的行为究竟有何不同? 的相关文章

随机推荐

  • Ruby 的 GServer 只想在本地主机上工作

    TCPServer new port 创建一个可以为来自本地主机或远程计算机的请求提供服务的服务器 但是 GServer new port 创建的服务器只能服务来自本地主机的请求 查看GServer的源码 它调用了TCPServer new
  • Pandas read_csv() 1.2GB 文件在具有 140GB RAM 的虚拟机上内存不足

    我正在尝试读取一个1 2G的CSV文件 其中包含25K记录 每条记录由一个id和一个大字符串组成 但是 大约 10K 行时 我收到此错误 pandas io common CParserError 标记数据时出错 C 错误 内存不足 这看起
  • 推送到 docker 公共存储库时是否需要手动标记“最新”?

    假设我有一张图像me mystuff v0 0 1 我发现如果我将其推送到存储库 docker push me mystuff v0 0 1 latest未创建 并且从另一台机器拉取时它会抱怨 例如 ssh me faraway faraw
  • scala 中的抽象类型

    我正在经历抽象类型Scala我收到一个错误 我正在尝试的例子 scala gt class Food abstract class Animal type SuitableFood lt Food def eat food Suitable
  • 如何使用 gzip 压缩 .net 对象实例

    我想在将数据库查询结果添加到缓存之前对其进行压缩 我希望能够压缩任何引用类型 我有一个用于压缩字符串的工作版本 这个想法基于 scott hanselman 的博客文章http shrinkster com 173t http shrink
  • 如何动态添加 ASP.NET 按钮来触发事件?

    这可能是一个简单的问题 但我不是 ASP NET 开发人员 而且我很困惑 我有一个简单的搜索例程 返回零到数百个结果 其中每个都必须作为按钮添加到页面中 我想设置按钮的文本和 CommandArgument 属性 以便单击按钮时我可以读回
  • 地图 API v3:计算方位

    我已经为此苦苦挣扎了一段时间 需要一些建议 我看过一些类似的主题 但找不到适合我的答案 我正在使用谷歌地图 API 创建一个应用程序 它将确定您的位置 确定特定点 b 点 然后移动箭头以指向 b 点的方向 我在计算方位时遇到困难 有人可以提
  • 成功插入后出现错误node.js mongodb无法读取记录的null属性0

    我使用 db collection insert 方法通过 function err records 回调在 mongodb 中添加文档 虽然插入成功 我在 mongolab 上检查了记录 但记录为空 因此它在记录 0 id处抛出错误 这是
  • Google Cloud Messaging - 有时在网络状态更改之前不会收到消息

    在开发一个与 GCM 集成的小项目时 我偶然发现了一些奇怪的问题 有时 当我开始查看日志以查看是否收到消息时 消息似乎不会发送 直到我更改网络状态 即最初使用 WiFi 如果我关闭 WiFi 并移至移动数据 消息就会到达 美好的 在我更改网
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h
  • 如何使用 TFS build 2015 运行自动硒测试?

    我有 NUnit 硒测试 已嵌入到单元测试中 并且我正在尝试使用 TFS Build 2015 运行它 所有测试在本地运行得很好 但不是从 TFS 服务器运行 我启用了代码覆盖率 发现 Module unittests dll 工作正常 大
  • 如何删除气球工具提示上的“扳手”按钮? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用正则表达式删除/匹配字符串之间的引号?

    我有以下一组数据 Production App Old Service Name ProdApp Slave1 Production App Old Service Name ProdApp Slave2 Production App Ol
  • YUI Compressor:什么是微观优化?

    YUI Compressor 在其 不是很广泛 文档中将此作为一个选项 disable optimizations Disable all the built in micro optimizations 有谁知道这意味着什么 这将打开 关
  • 在 php 中检测 iPad?

    如何向 iPad 查看者提供不同的页面 if SERVER HTTP USER AGENT Mozilla 5 0 iPad U CPU iPhone OS 3 2 like Mac OS X en us AppleWebKit 531 2
  • 从firebase云函数获取UID

    有没有办法获得uid当我触发存储事件时 我想在图像上传到 firebase 存储时创建一个拇指 然后更新数据库中用户图像配置文件的 url exports uploadphoto functions storage object onCha
  • 我们如何从长字符串中提取字符串的特定部分?

    我有一个 HTML 源代码 其中包含手机号码 我想从源代码中提取电话号码 每个电话号码都有开始和结束标志 假设 HTML 代码示例是 每个手机号码都以 phone 开头 以 结尾 如下所示 code b2e1d163b0b div clas
  • 使用 docx4j 从带有 Base64 图像的 HTML 生成 .docx

    我正在尝试生成一个 docx from a HTML字符串与docx4j in Java 其中包含 Base64 图像 目前 我能够生成 Word 并下载它 在 Vaadin 项目内 但图像无法正确插入 但是 如果我把HTML代码写入一个索
  • 如何修复此“输入超出文件末尾”错误? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须找到包含以下内容的所有步骤PGM FTP然后阅读所有行 直到找到另一个没有的步骤PGM FTP 它可以是任何东西 除了FTP 我需要
  • Python bool 和 numpy bool_ 的行为究竟有何不同?

    TLDR is comparison 适用于 Pythonbool且不适用于 numpybool 的 还存在其他差异吗 几天前我遇到了布尔值的奇怪行为 当我尝试对这个 numpy 数组使用 is comparison 时 arr1 np a