正如我之前的其他人一样,我正试图从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)
这看起来很奇怪,我只是正数,我为什么得到负值?
这里,R中的任务相同
k<-rep(0,100000)
for (i in 1:100000){
k[i]<-i^2
}
plot(k,type="l")
谁能解释一下这里发生了什么?
非常感谢您的帮助.
最佳答案 因为整数溢出.
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)
生成