【问题标题】:numpy.any() returns True but "is True" comparison fails [duplicate]numpy.any() 返回 True 但“是 True”比较失败 [重复]
【发布时间】:2018-02-10 15:40:24
【问题描述】:

如果numpy.any() 返回True,则与is True 的比较失败,但与== True 的比较有效。有谁知道为什么?

一个最小的例子

from __future__ import print_function
import numpy

a = numpy.array([True])

if a.any() == True:
  print('== works')

if a.any() is True:
  print('is works')

这段代码的输出只是== works

【问题讨论】:

标签: python numpy


【解决方案1】:

numpy 有自己的布尔值,numpy.True_numpy.False_,它们与 Python 的原生布尔值具有不同的标识。无论如何,您应该使用== 进行此类股权比较

>>> a.any() is True
False
>>> a.any() is numpy.True_
True
>>> True is numpy.True_
False
>>> True == numpy.True_
True

【讨论】:

  • 实际上,根本不检查布尔相等性。只需执行if a.any()if not a.any()
  • @poke timgeb 是的,当然同意,在这个特定的布尔上下文中,我的意思是一般来说,股权检查比身份检查更可取(除非你实际上是在尝试检查身份)跨度>
【解决方案2】:

返回的类型不同:

>>> type(a.any())
<type 'numpy.bool_'>
>>> type(True)
<type 'bool'>

所以,a.any() 不是 True 这样,它只等于 True

【讨论】:

    【解决方案3】:

    这是因为 a.any() 不返回标准 Python Truebool 类的实例)。

    >>> type(a.any())
    <type 'numpy.bool_'>
    

    所以简而言之,numpy 有自己的 True-value,但是当你打印它时,它看起来就像 Python 内置的 True

    【讨论】:

    • 谢谢,就是这样!我应该检查一下类型。谢谢!
    【解决方案4】:

    numpy.any 返回一个 numpy.bool_,它是 numpy 使用的 different datatype

    因此,您无法使用身份检查将 numpy.bool_ 与 Python bool 进行比较。你必须使用 numpy 的 true 然后:numpy.True_

    >>> a.any() is numpy.True_
    True
    

    他们不使用 Python 的 bool 的主要原因是因为 numpy.bool_ 只是一个字节,而 Python bool 是基于 Python int,它总是更昂贵。

    【讨论】:

    • numpy 也有numpy.bool,其中is Python 的原生bool,我猜legacy 会产生一些奇怪的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多