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

C. *_*oli 6 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
Run Code Online (Sandbox Code Playgroud)

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

kaz*_*ase 1

这是numpy 中的一个错误。尽管这个问题据称已在 2015 年得到修复,但看起来仍然存在问题。

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

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

>>> np.true_divide(844, 8186, dtype=np.float64)
-12.666666666666666
Run Code Online (Sandbox Code Playgroud)

仅对 -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
Run Code Online (Sandbox Code Playgroud)