平方数字Python时奇怪的错误

正如我之前的其他人一样,我正试图从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时奇怪的错误》

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

这里,R中的任务相同

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

和相对输出
《平方数字Python时奇怪的错误》

谁能解释一下这里发生了什么?

非常感谢您的帮助.

最佳答案 因为整数溢出.

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)

生成

《平方数字Python时奇怪的错误》

点赞