boolean and type checking in python vs numpy(python vs numpy中的布尔和类型检查)
问题描述
我今天在 python if
子句中遇到了意想不到的结果:
I ran into unexpected results in a python if
clause today:
import numpy
if numpy.allclose(6.0, 6.1, rtol=0, atol=0.5):
print 'close enough' # works as expected (prints message)
if numpy.allclose(6.0, 6.1, rtol=0, atol=0.5) is True:
print 'close enough' # does NOT work as expected (prints nothing)
经过一番探索(即这个问题,特别是this answer),我明白了原因:numpy.allclose()
返回的type
是numpy.bool_
而不是普通的旧 bool
,显然如果 foo = numpy.bool_(1)
,那么 if foo
将评估为 True
而 if foo 为 True
将评估为 False
.这似乎是 is
运算符的工作.
After some poking around (i.e., this question, and in particular this answer), I understand the cause: the type
returned by numpy.allclose()
is numpy.bool_
rather than plain old bool
, and apparently if foo = numpy.bool_(1)
, then if foo
will evaluate to True
while if foo is True
will evaluate to False
. This appears to be the work of the is
operator.
我的问题是:为什么 numpy 有自己的布尔类型,鉴于这种情况,最佳实践是什么?在上面的示例中,我可以通过编写 if foo:
来获得预期的行为,但我喜欢更严格的 if foo is True:
因为它排除了像 2
和 [2]
从返回 True
,有时需要显式类型检查.
My questions are: why does numpy have its own boolean type, and what is best practice in light of this situation? I can get away with writing if foo:
to get expected behavior in the example above, but I like the more stringent if foo is True:
because it excludes things like 2
and [2]
from returning True
, and sometimes the explicit type check is desirable.
推荐答案
为什么 numpy 有自己的布尔类型
why does numpy have its own boolean type
空间和速度.Numpy 将事物存储在紧凑的数组中;如果它可以将布尔值放入单个字节中,它会尝试.对于 Python 对象,您无法轻松做到这一点,因为您必须存储引用,这会显着降低计算速度.
Space and speed. Numpy stores things in compact arrays; if it can fit a boolean into a single byte it'll try. You can't easily do this with Python objects, as you have to store references which slows calculations down significantly.
我可以写 if foo: 来获得上面示例中的预期行为,但我喜欢更严格的 if foo is True: 因为它排除了像 2 和 [2] 之类的东西返回 True,有时是显式的类型检查是可取的.
I can get away with writing if foo: to get expected behavior in the example above, but I like the more stringent if foo is True: because it excludes things like 2 and [2] from returning True, and sometimes the explicit type check is desirable.
好吧,不要那样做.
这篇关于python vs numpy中的布尔和类型检查的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:python vs numpy中的布尔和类型检查


基础教程推荐
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- 包装空间模型 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01