Numpy整数除法有时会在生成时产生错误的结果

时间:2017-07-24 10:24:29

标签: python numpy type-conversion

这两个部门给出不同结果的原因是什么?我很困惑,因为有些数字它会给出相同的结果,而有些则没有。

>>> import numpy as np
>>> a, b = np.array([844]), np.array([8186])
>>> a.dtype, b.dtype
(dtype('int32'), dtype('int32'))
>>> np.true_divide(a, b, dtype=np.float32)
array([ 0.10310286], dtype=float32)
>>> np.true_divide(a, b, dtype=np.float64)
array([-12.66666667]) # different result
>>> np.true_divide(a, b, dtype=np.float32).astype(np.float64)
array([ 0.10310286])

>>> a, b = np.array([1]), np.array([2])
>>> np.true_divide(a, b, dtype=np.float32)
array([ 0.5], dtype=float32)
>>> np.true_divide(a, b, dtype=np.float64)
array([ 0.5]) # same results

在Windows x64,python 3.5和3.6 x64上测试,numpy 1.13.1。

1 个答案:

答案 0 :(得分:1)

这是bug in numpy。 虽然这应该在2015年得到修复,但看起来仍然会造成问题。

当由于强制转换而导致解析类型签名失败时,true_divide会将输入转换为int8

>>> np.int8(844) / np.int8(8186)
-12.666667

>>> np.true_divide(844, 8186, dtype=np.float64)
-12.666666666666666

只有-128到127之间的数字才能得到正确的结果,因为这是int8中可用的范围。

作为一种解决方法,您可以指定完整的签名,而不仅仅是返回类型:

>>> np.true_divide(844, 8186, signature='ii->d')  # int32, int32 -> float64
0.10310285853896897

>>> np.true_divide(844, 8186, signature=(np.int32, np.int32, np.float64))
0.10310285853896897