1

我正在尝试映射一个简单的二次函数,其中 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 时,平方函数就会完全中断并开始给我绝对荒谬的答案。这只是一个数据类型错误,还是这里发生了我不知道的其他事情?

4

1 回答 1

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足够大,同样的问题将再次发生!

于 2014-11-25T14:41:51.500 回答