这两个部门产生不同结果的原因是什么?我非常困惑,因为对于一些数字,它给出了相同的结果,而对于一些数字,它不是这样的。
>>> 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,Python3.5和3.6 x64,numpy 1.13.1上测试。
编辑:这是一个numpy错误,已经修复(https://github.com/numpy/numpy/pull/9469)。
发布于 2017-07-24 12:01:37
这是一个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
https://stackoverflow.com/questions/45278112
复制相似问题