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)
上一篇 2022年5月2日 下午7:20
下一篇 2022年5月2日 下午7:40


相关推荐

  • vue2 renrne 引入tinymce[通俗易懂]

    vue2 renrne 引入tinymce[通俗易懂]tinymce1.引入和原始使用下载地址:https://www.tiny.cloud/get-tiny/self-hosted/语言包地址:https://www.tiny.clou

    2022年7月2日
    81
  • 论概率:从局部随机性到整体确定性

    论概率:从局部随机性到整体确定性概率论与数理统计概率计算三原则学概率论拼的不是数学,而是语文能力独立性条件概率与贝叶斯公式全概率公式 概率计算三原则所有概率问题,都基于三个计算法则:加法法则:如果事件A和事件B相互排斥,而事件A有p种产生方式,事件B有q种产生方式,则事件”A或B”有p+q种产生方式。乘法法则:如果事件A和事件B相互独立,且事件A有p种产生方式,事件B有q种产生方式,则事件”A与B”有p*q种产生方式。.

    2022年5月30日
    43
  • python对奇异矩阵求逆_奇异矩阵-python

    python对奇异矩阵求逆_奇异矩阵-python下面的代码显示了一个矩阵的奇点问题 因为我在 Pycharm 中工作 raiseLinAlgE Singularmatr numpy linalg linalg LinAlgError Singularmatr 我想问题是 K 但我不能确切地理解如何 fromnumpyimp linalgimport

    2025年9月22日
    6
  • 创意的课程设计——憨憨钟设计(碾压)

    创意的课程设计——憨憨钟设计(碾压)目录写在前面的话设计的实际演示憨憨钟的主要功能设计的实现过程界面设计模型结构设计元件清单调试异常分析结语写在前面的话大家好,学习之余给大家分享一个这学期设计的课程设计,互相学习借鉴。课程设计,尤其是自定义的课程设计,自盘古开天地以来就困扰着每一位工科男。我,一枚工科男,觉得需要站出来为大家排忧解难了。这学期有自定义的课程设计,所以我就设计了一个很有创意的课程设计,是一个国外开源的设计,结合了国外开源资料和一些大佬的实践经验。设计的实际演示憨憨钟自动写时间的效果:憨憨钟的演示效果1憨憨钟自动画天气

    2022年5月20日
    39
  • c语言cross函数什么意思,通达信cross函数用法,通达信 filter函数 返回什么值

    c语言cross函数什么意思,通达信cross函数用法,通达信 filter函数 返回什么值Q1 通达信 filter 函数返回什么值结果 返回一个逻辑真值 当逻辑条件为真时 如果在 N 周期内已真过 将当前真值置为 0 即过滤 下面网页上有详细讲解 http www chcj net thread 945487 1 1 html 希望对你有点帮助 Q2 求通达信公式满足条件 CROSS EXP1 EXP2 向左画水平射线就按照这句 CROSS EXP1 EXP2 上穿代码 可以利用 DRAWSL

    2026年3月17日
    1
  • 慧荣SM2246EN开卡Toggle 8贴东芝闪存SSD失败解决方法[通俗易懂]

    慧荣SM2246EN开卡Toggle 8贴东芝闪存SSD失败解决方法[通俗易懂]如果你的固态硬盘是慧荣SM2246EN主控的,且闪存为8贴9D2H9E2H9DDJ9EDJ9EFK9DFK9DFL9EFL9CDJ等8Die4CE的,那么遇到开卡失败的话,可以尝试下面的方法来解决:打开慧荣SM2246EN量产工具文件夹中的FlashDB文件夹,找到里面的Flash.SET(闪存参数配置)文件,用记事本打开此文件后,把对应的闪存参数第46项数值(十六进制)适当降低1-6(十六进制)即可解决。比如下面以9DDJ为例:减少后,再次去开卡,应该就能过了,如果你也遇到

    2022年6月8日
    80

发表回复

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

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