Python float和numpy float32的区别



内置的floatnumpy.float32有什么区别?

a = 58682.7578125
print type(a)
print a
print type(numpy.float32(a))
print numpy.float32(a)
输出:

<type 'float'>
58682.7578125
<type 'numpy.float32'>
58682.8

我在这里发现numpy.float32是:

float32单精度浮点数:符号位,8位指数,23位尾数

没有找到float内置格式

Python的标准float类型是C double: http://docs.python.org/2/library/stdtypes.html#typesnumeric

NumPy的标准numpy.floatnumpy.float64相同,

数据类型numpy浮点数和内置Python浮点数是相同的,但是numpy浮点数上的布尔操作返回np.bool_对象,对于val is True总是返回False。在下面的例子:

In [1]: import numpy as np
   ...: an_np_float = np.float32(0.3)
   ...: a_normal_float = 0.3
   ...: print(a_normal_float, an_np_float)
   ...: print(type(a_normal_float), type(an_np_float))
0.3 0.3
<class 'float'> <class 'numpy.float32'>

Numpy浮点数可以由数组操作的标量输出产生。如果不检查数据类型,很容易将numpy浮点数与本机浮点数混淆。

In [2]: criterion_fn = lambda x: x <= 0.5
   ...: criterion_fn(a_normal_float), criterion_fn(an_np_float)
Out[2]: (True, True)

即使布尔运算看起来也是正确的。然而,numpy float的结果不是一个原生布尔数据类型,因此不可能是真值。


In [3]: criterion_fn(a_normal_float) is True, criterion_fn(an_np_float) is True
Out[3]: (True, False)
In [4]: type(criterion_fn(a_normal_float)), type(criterion_fn(an_np_float))
Out[4]: (bool, numpy.bool_)

根据这个github线程,criterion_fn(an_np_float) == True将正确评估,但这违背了PEP8风格指南。

从numpy操作的结果中提取原生浮点数。你可以做an_np_float.item()来显式地做(参考:this SO post)或简单地通过float()传递值。

最新更新