gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:56:00 25 4
gpt4 key购买 nike

TLDR: is-comparison 适用于 Python bool 's 并且不适用于 numpy bool_的。是否存在其他差异?

几天前,我遇到了 bool 人的一种奇怪行为。当我尝试对这个 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_arrnumpy.object build 由于几个非数字元素,所以它包含 Python bool 和 arr1numpy.bool_ build .所以我检查了他们的行为:
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]
在所有这些之后,我有两个问题:
  • numpy.bool_bool他们的共同行为还有其他一些差异吗? (我知道 numpy.bool_ 有很多 numpy 函数和参数,比如 .T 等)
  • 如何检查 numpy 数组是否只包含 numpy bool 值,而没有 Pythonic bool 值?

  • (PS:是的, 现在 我知道用 is 比较真/假是不好的):

    Don't compare boolean values to True or False using ==.

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



    编辑 1:another question 中所述, numpy 有自己的 bool_类型。但是这个问题的细节有点不同:我发现 is-statements 的工作方式不同,但在此差异之前 - 是否有其他共同点 bool_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)

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

    在第一种情况下,数组 dtype 是 bool 值。元素表示 bool 值,但它们本身不是 Python True/False对象。严格来说 Out[119]contain np.bool_对象。 Out[119][1]是类型 bool_ ,但这是“拆箱”的结果。这是什么 ndarray索引在您请求元素时产生。 (这种“拆箱”区别适用于所有非对象 dtype。)

    通常我们不创建 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测试。

    让我们使用对象 dtype 数组:
    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]

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

    专注于您的问题。
  • np.bool_(False)是一个独特的对象,但不同于 False .正如您所注意到的,它具有许多与 np.array(False) 相同的属性/方法。 .
  • 如果数组数据类型为 bool它不包含 Python bool对象。它甚至不包含 np.bool_对象。但是索引这样的数组会产生 bool_ .并申请item()反过来又会产生一个 Python bool .
  • 如果数组对象 dtype,它很可能会包含 Python bool , 除非您采取了特殊措施来包含 bool_对象。
  • 关于python - Python bool 和 numpy bool_ 的行为究竟有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55905690/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com