Numpy无法正确排列数组

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时,平方功能完全断开并开始给我绝对荒谬的答案.这只是一个数据类型错误,还是我不知道的其他事情?

Ale*_*ley 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)
Run Code Online (Sandbox Code Playgroud)

请注意,如果数字zs足够大,将再次出现同样的问题!