numpy.astype数据精度导致数据变化的问题「建议收藏」

numpy.astype数据精度导致数据变化的问题「建议收藏」在用numpy.astype强制转换数据类型的时候,由于numpy精度的问题将会对长度超过16位的数据发生不可预见的变化。见以下样例:a=np.random.randint(10000000000000000,100000000000000000,6,dtype=np.int64).reshape(3,-1)aOut[250]:array([[84627891441616237…

大家好,又见面了,我是你们的朋友全栈君。

在用numpy.astype强制转换数据类型的时候,由于numpy精度的问题将会对长度超过16位的数据发生不可预见的变化。

见以下样例:

a=np.random.randint(10000000000000000,100000000000000000,6,dtype=np.int64).reshape(3,-1)

a
Out[250]: 
array([[84627891441616237, 76092046570743607],
       [98092567621991294, 29336557186973849],
       [27275086880071664, 17713014931142607]], dtype=int64)

a==a.astype(np.float64).astype(np.int64)
Out[251]: 
array([[False, False],
       [False, False],
       [ True, False]])

仔细观察a 和转换一遍后的a

a
Out[252]: 
array([[84627891441616237, 76092046570743607],
       [98092567621991294, 29336557186973849],
       [27275086880071664, 17713014931142607]], dtype=int64)

a.astype(np.float64).astype(np.int64)
Out[253]: 
array([[84627891441616240, 76092046570743600],
       [98092567621991296, 29336557186973848],
       [27275086880071664, 17713014931142608]], dtype=int64)

可以发现,所有数据前16位都是相同的,16位以后就不可控了,导致错误发生的原因,就是numpy的32位精度问题导致的。

怎么解决呢?

我尝试了DataFrame的object类型可以解决,解决方式如下:

将numpy转换为DataFrame的时候,指定数据类型为object。

生成之后,在利用astype将其转换为int64即可。

具体应用可见以下样例:

rl
Out[255]: 
array([-8049777870090522920, -5440935078746751688, -3933548592432029974,
       -2462334750121545038, -1190291399416696655,   501852907112055918,
        1104104769051714879,  1318804999709453069,  1643349955204012180,
        1985695761539862128,  2177922432728714602,  2539438373990063976,
        2757041686965216513,  2930804226408986280,  4652176466101519414,
        5587216625180694234,  6110778615839656518,  8414204104888822915],
      dtype=int64)

V
Out[256]: 
array([[ 1.17613153e+222, -5.20143643e+220, -2.56059855e+218,
        -2.56059878e+218,  1.82560909e+211,  1.01358871e+211,
         1.82560909e+211, -1.05320730e+221,  8.07676648e+221,
         3.23330432e+194, -2.48561946e+218, -1.18058699e+219,
         2.65113824e+164,  9.86541855e+219, -3.21047863e+219,
         7.98645998e+193, -8.12021191e+210,  1.01358815e+211],
       [-8.92833386e+221, -1.00145726e+221,  2.14225335e+218,
         2.14225304e+218, -1.40702046e+211, -1.60296698e+211,
        -1.40702046e+211,  1.04484451e+221,  9.40007615e+221,
         2.73018012e+194, -3.14728928e+218, -1.05611169e+219,
         9.09859019e+163, -5.68088783e+219,  5.46366951e+219,
        -2.49687040e+194, -1.95946525e+210, -1.60296712e+211]])

rl=DataFrame([rl,V[0],V[1]],dtype=object).T
rl.columns=['SOURCEID','ax','ay']
rl.SOURCEID=rl.SOURCEID.astype('int64')

rl.SOURCEID.values
Out[258]: 
array([-8049777870090522920, -5440935078746751688, -3933548592432029974,
       -2462334750121545038, -1190291399416696655,   501852907112055918,
        1104104769051714879,  1318804999709453069,  1643349955204012180,
        1985695761539862128,  2177922432728714602,  2539438373990063976,
        2757041686965216513,  2930804226408986280,  4652176466101519414,
        5587216625180694234,  6110778615839656518,  8414204104888822915],
      dtype=int64)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134530.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【原】Github系列之一:一起做仿天气类应用中的实时模糊效果LiveBlur

    【原】Github系列之一:一起做仿天气类应用中的实时模糊效果LiveBlur

    2021年9月4日
    50
  • Android定时器Timer简单使用「建议收藏」

    Android定时器Timer简单使用「建议收藏」Android定时器Timer简单使用Timer简介Timer使用总结Timer简介Timer(计时器)位于java.util包下,可用于创建定时任务,任务可以安排为一次性执行,也可以定期重复执行。每个计时器对象对应一个后台线程(TimerThread)。简单理解为创建Timer对象,对应TimerThread线程循环开始从TaskQueue队列中执行一个TimerTask任务。Timer使用创建Timer对象vartimer=Timer()添加需要执行的任务//创建计

    2022年7月25日
    7
  • IE8允许ActiveX控件设置

    IE8允许ActiveX控件设置IE11允许ActiveX控件设置在IE浏览器菜单栏,找到“Internet选项”,—》“安全”—》“Internet”—》“自定义级别”找到ActiveX控件相关信息。其他都改为启用对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本:提示下载未签名的ActicveX控件:提示下载已签名的ActicveX控件:提示允许script默认原设置

    2022年5月14日
    50
  • 我的世界服务器开启显示坐标的指令,我的世界坐标怎么看 坐标指令「建议收藏」

    我的世界服务器开启显示坐标的指令,我的世界坐标怎么看 坐标指令「建议收藏」在我的世界游戏中,坐标这个问题如果玩的很6的话能够帮助我们瞬间移动,去到任何想去的地方,这时有不少玩家不禁想问了,我的世界坐标怎么看,坐标指令又是什么呢?坐标(coordinates)在数字上反映了您在主世界中的位置。坐标基于一个由三条交于一点(即原点)的坐标轴而形成的网格。玩家会出生在距离原点数百方块的位置上。x轴反映了玩家距离原点在东()西(-)方向上的距离,如经度。z轴反映了玩家距离原点在…

    2022年9月24日
    0
  • oracle查找数据库中所有表_oracle查看某个表的索引

    oracle查找数据库中所有表_oracle查看某个表的索引ORACLE查询数据中所存在的表,搜索指定的表

    2022年4月22日
    82
  • 【软件测试】测试用例八要素

    【软件测试】测试用例八要素目录测试用例八要素1.测试用例编号2.测试模块3.测试用例标题4.重要级别5.预置条件6.测试输入7.操作步骤8.预期输出测试用例额外的要素1.用例设计者2.用例设计日期3.用例版本号4.对应的开发人员5.测试类型测试用例八要素1.测试用例编号编号是由字母和数字组合而成的,用例的编号应该具有唯一性,易识别性,有且于其和测试结果、错误报告等其他文档的链接。这样看到编号就可以知道是做的什么测试,测试的对象是什么,也方…

    2022年6月28日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号