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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux系统chmod 755权限

    linux系统chmod 755权限最近学习Lua,写脚本./执行遇到-bash:./helloworld.lua:Permissiondenied提示,意思是没有可执行权限;通过查看使用:sudochmod755helloworld.lua给脚本添加可执行权限正常执行;ll查看文件发现-rwxr-xr-x1rootroot65Oct2119:13helloworld.lua多了读写可执行权限;下面对这些…

    2022年7月16日
    14
  • 数据库设计规范

    数据库设计规范数据库的重要性不言而喻。对程序员来说跟数据库打交道更是家常便饭。数据库给开发带来了巨大的便利。我们或多或少的知道一些数据库设计规范,但并不全面。今天我就简单整理一下,帮自己做个总结梳理,也希望可以帮到小伙伴们。数据库设计规范包括命名规范、库表基础规范、字段规范、索引规范和SQL设计规范。1.命名规范1.1库名、表名、字段名禁止使用MySQL保留字。1.2库名、表名、字段名使…

    2022年7月12日
    21
  • 深入理解MySQL索引设计和优化原则[通俗易懂]

    深入理解MySQL索引设计和优化原则[通俗易懂]索引类型探讨索引设计和优化原则之前,先给大家熟悉一下索引类型:主键索引PRIMARYKEY:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。唯一索引UNIQUE:唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。创建命令:ALTERTABLEtable_nameADDUNIQUE(column);普通索引INDEX:最基本的索引,它没有任何限制。创建命令:ALTERTABLEtable_nameADDINDEXi..

    2022年6月24日
    22
  • Python基础语法知识点汇集「建议收藏」

    Python基础语法知识点汇集「建议收藏」本文小结了phython基础语法文章目录一.注释二.变量的类型三.标识符和关键字四.输出五.输入六.运算符七.数据类型转换一.注释<1>单行注释以#开头,#右边的所有文字当作说明,而不是真正要执行的程序,起辅助说明作用#我是注释,可以在里写一些功能说明之类的哦print(‘helloworld’)<2>多行注释”’我是多行注…

    2022年6月24日
    25
  • 如何在Ubuntu 14.04 和14.10 上安装新的字体

    如何在Ubuntu 14.04 和14.10 上安装新的字体

    2022年3月2日
    40
  • 数据仓库和数据集市详解:ODS、DW、DWD、DWM、DWS、ADS「建议收藏」

    数据仓库和数据集市详解:ODS、DW、DWD、DWM、DWS、ADS「建议收藏」@TOC数据流向应用示例何为数仓DWDatawarehouse(可简写为DW或者DWH)数据仓库,是在数据库已经大量存在的情况下,它是一整套包括了etl、调度、建模在内的完整的理论体系。数据仓库的方案建设的目的,是为前端查询和分析作为基础,主要应用于OLAP(on-lineAnalyticalProcessing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。目前行业比较流行的有:AWSRedshift,Greenplum,Hive等。数据仓库并不是数据的最终目的地

    2022年6月26日
    97

发表回复

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

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