首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >强制转换时,Numpy整数除法有时会产生错误的结果

强制转换时,Numpy整数除法有时会产生错误的结果
EN

Stack Overflow用户
提问于 2017-07-24 18:24:29
回答 1查看 1.3K关注 0票数 7

这两个部门产生不同结果的原因是什么?我非常困惑,因为对于一些数字,它给出了相同的结果,而对于一些数字,它不是这样的。

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-24 20:01:37

这是一个bug in numpy。虽然这个问题应该在2015年就已经解决了,但看起来它仍然在制造问题。

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

代码语言:javascript
代码运行次数:0
运行
复制
>>> np.int8(844) / np.int8(8186)
-12.666667

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

您只会得到介于-128和127之间的数字的正确结果,因为这是int8中可用的范围。

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

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45278112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档