正如我之前的其他人一样,我正试图从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")
有人可以解释一下这里发生了什么吗?
非常感谢你的帮助。
答案 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)
产生