这两个部门给出不同结果的原因是什么?我很困惑,因为有些数字它会给出相同的结果,而有些则没有。
>>> 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。
答案 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