被pandas dtype转换为np.float16值2053所混淆而变成2052

时间:2019-04-27 13:43:12

标签: python pandas numpy

我试图通过向下转换浮点数据类型来减少内存消耗。

我检查了np.float16的范围:

np.finfo(np.float16)
finfo(resolution=0.001, min=-6.55040e+04, max=6.55040e+04, dtype=float16)

这显示了-6.55040e+04 < 2053 < 6.55040e+04

现在:

s = pd.Series([2051,2052,2053,2054])
s.astype(np.float16)

0    2052.0
1    2052.0
2    2052.0
3    2054.0

为什么会这样?

更新
np.finfo

借用文档
numpy.finfo
class numpy.finfo[source]
Machine limits for floating point types.

Parameters: 
dtype : float, dtype, or instance

Kind of floating point data-type about which to get information.

Attributes

eps (float) The smallest representable positive number such that 1.0 + eps != 1.0. Type of eps is an appropriate floating point type.
epsneg  (floating point number of the appropriate type) The smallest representable positive number such that 1.0 - epsneg != 1.0.
iexp    (int) The number of bits in the exponent portion of the floating point representation.
machar  (MachAr) The object which calculated these parameters and holds more detailed information.
machep  (int) The exponent that yields eps.
max (floating point number of the appropriate type) The largest representable number.
maxexp  (int) The smallest positive power of the base (2) that causes overflow.
min (floating point number of the appropriate type) The smallest representable number, typically -max.
minexp  (int) The most negative power of the base (2) consistent with there being no leading 0’s in the mantissa.
negep   (int) The exponent that yields epsneg.
nexp    (int) The number of bits in the exponent including its sign and bias.
nmant   (int) The number of bits in the mantissa.
precision   (int) The approximate number of decimal digits to which this kind of float is precise.
resolution  (floating point number of the appropriate type) The approximate decimal resolution of this type, i.e., 10**-precision.
tiny    (float) The smallest positive usable number. Type of tiny is an appropriate floating point type.

1 个答案:

答案 0 :(得分:2)

这与minmax无关,它们决定了float16可以分别采用的最低和最高值,而是resolution或之前两个值之间的最小差它们被认为是相同的。

finfo显示float16的分辨率为0.001,或4个有效数字。您所用的数字2是第4位有效数字。