我正在尝试绘制一个简单的二次函数,其中zs是一个numpy数组,R是一个常量
Ns = -np.square(zs) + 2*zs*R+ 3*R**2
它在大多数情况下工作正常,但出于某种原因,每当我将评估设置为以下代码中断时:
>>>zs = np.array(range(80262,80268)
>>>R = 26756
>>>Ns = -np.square(zs) + 2*zs*R+ 3*R**2
>>>print Ns
array([ 642108, 535095, 428080, 321063, 214044
4295074319], dtype=int64)
数组中的最后一个值应该是107023.每当我超过80267时,平方功能完全断开并开始给我绝对荒谬的答案。这只是一个数据类型错误,还是我不知道的其他事情?
答案 0 :(得分:5)
问题是zs = np.array(range(80262,80268))
会创建一个int32
值数组。
np.square(zs)
返回与zs
具有相同数据类型的数组,并且数组中的最终平方值溢出了已分配的四个字节的内存。
您看到Ns = -np.square(zs) + 2*zs*R+ 3*R**2
的数据类型为int64
,因为NumPy为此数组提供了更多内存以容纳更大的数字。但是,为时已晚:您已在np.square(zs)
中拥有溢出值。
要解决此问题,请使用zs
数据类型
np.int64
zs = np.arange(80262, 80268, dtype=np.int64)
请注意,如果zs
中的数字足够大,会再次出现同样的问题!