numpy是一个很好用的python模块,数值运算相当方便。今天遇到了一个小问题,和大家分享一下。先扔个例子。
In [1]: import numpy as np
In [2]: z = np.array([2434,17326,12736,1763])
In [3]: z*1000000
Out[3]: array([-1860967296, 146130816, -148901888, 1763000000])
嗯???两个整数相乘居然出现了负数!!!
找了几个帖子,发现是由于数据超限了。python3的官网里造就生命,int表示整型和长整型整数,可以根据实际情况选择合适的类型,但是我忽略了numpy自定义的数据类型。
numpy里默认的数值类型是int32,范围是-2147483648~2147483647,在超过这个范围之后不会报错,而是继续计算,一种情况是像上述的代码一样,出现负值,一眼就看出来有问题;但是有时候只是计算结果不对,不细心的根本发现不了,比如第二个元素运行结果错误,17326*1000000=146130816。解决办法就是在定义数组的时候指定输出格式,int64位的范围-9223372036854775808~9223372036854775807,基本上能满足所有的数据计算要求。
In [4]: z = np.array([2434,17326,12736,1763],dtype='int64')
In [5]: z*1000000
Out[5]: array([ 2434000000, 17326000000, 12736000000, 1763000000], dtype=int64)
其实还有另外一种解决办法,可以使用科学计数法。
In [6]: z*1e6
Out[6]: array([2.4340e+09, 1.7326e+10, 1.2736e+10, 1.7630e+09])
这种书写方式虽然能避免一些问题,但是在创建数组的时候,最好根据自己的数据情况,选择合适的数据类型,尽量少挖坑。
参考文章:
[1] https://blog.csdn.net/CxsGhost/article/details/103834353
[2] https://numpy.org/doc/stable/
#如有侵权,请告知删除#
#如有错误,欢迎指正#