use*_*648 1 python arrays numpy function perfect-square
我试图绘制一个简单的二次函数,其中zs是一个numpy数组,R是一个常数
Ns = -np.square(zs) + 2*zs*R+ 3*R**2
Run Code Online (Sandbox Code Playgroud)
它在大多数情况下工作正常,但出于某种原因,每当我将评估设置为以下代码中断时:
>>>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)
Run Code Online (Sandbox Code Playgroud)
数组中的最后一个值应该是107023.每当我超过80267时,平方功能完全断开并开始给我绝对荒谬的答案.这只是一个数据类型错误,还是我不知道的其他事情?
麻烦的是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)
Run Code Online (Sandbox Code Playgroud)
请注意,如果数字zs足够大,将再次出现同样的问题!