平方数字Python时奇怪的错误

时间:2018-04-12 14:41:13

标签: python r numpy 32-bit

正如我之前的其他人一样,我正试图从R过渡到Python。为了做到这一点,我只是试图在Python中复制简单的任务,只是为了对代码充满信心。

我试图在Python中创建一个非常简单的循环。

这里是代码:

import numpy as np
import matplotlib as mp
k=np.repeat(0, 100000, axis=0)
for x in np.arange(1,100001,1):
    k[x-1]=(x**2)
mp.pyplot.plot(k)

输出就是这个 Python Graph

这看起来很奇怪,我只是正数,我为什么得到负值?

这里,R

中的相同任务
k<-rep(0,100000)
for (i in 1:100000){
k[i]<-i^2
}
plot(k,type="l")

和相对输出 R Graph

有人可以解释一下这里发生了什么吗?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:6)

由于整数溢出。

Numpy假设数组中的所有元素都是int32,因此有些元素在平方时会溢出:

k = np.repeat(0, 100000, axis=0)
print(k.dtype)
# int32
for x in np.arange(1, 100001, 1):
    k[x - 1] = (x ** 2)
print(k[k < 0])
# [-2147479015 -2147386332 -2147293647 ...,     -537551     -352192 -166831]

这可以通过让Numpy(很好地)使用np.int64作为其元素的数据类型来解决。

你的代码也没有那么高效,因为它使用了一个显式的for循环(由Python解释器执行),而不是利用Numpy执行C代码的矢量化能力,因此更快,更短(在这种情况下是单行):

k = np.array(range(1, 100001), dtype=np.int64) ** 2 
# or k = np.arange(1, 100001, 1, dtype=np.int64) ** 2
mp.pyplot.plot(k)

产生

enter image description here