Python numpy uint64在division上转换为float

时间:2016-05-02 23:53:48

标签: python numpy type-conversion python-2.x

我想做一个简单的整数除法,例如1/3=0,但uint64表现得非常奇怪,导致我的结果被渲染为浮动。为什么呢?

python> uint64(100)/3
Out[0]: 33.333333333333336
python> uint64(100)/uint64(3)
Out[1]: 33
python> int64(100)/3
Out[2]: 33
python> int64(100)/uint64(3)
Out[3]: 33.333333333333336
python> int32(100)/int64(3)
Out[4]: 33

1 个答案:

答案 0 :(得分:2)

这是因为Python看到了一个有符号和无符号的类型,并试图自动推导出将被签名的结果类型。但由于第一个64位数字是无符号的,因此签名版本需要65位。由于Python / Numpy中没有高于64位的整数类型,Python选择float64。标准类型即除数3int64,这就是第一个示例将转换为float64的原因。 当然,这也适用于多重复制:

python> import numpy as np
python> type( np.int64( 10 ) * np.int64( 1 ) )
Out[0]: numpy.int64
python> type( np.uint64( 10 ) * np.uint64( 1 ) )
Out[1]: numpy.uint64
python> type( np.uint64( 10 ) * np.int64( 1 ) )
Out[2]: numpy.float64

请注意,此自动类型扣除仅适用于不同的签名类型,因为它与值无关,否则几乎所有类型都必须以float64结尾,因为例如在连续三次乘法后,它可能不再适合uint64

type(uint64(12345678900)*uint64(12345678900))
/usr/bin/ipython:1: RuntimeWarning: overflow encountered in ulong_scalars
#! /usr/bin/python
Out[3]: numpy.uint64

注意:请注意,在Python 3中,简单的斜杠是默认的整数除法。相反,您必须使用3 // 2在Python 3中将1作为3 / 2 == 1.5