(已解决)Python在数学计算方面表现得很奇怪,为什么会发生这种情况?

(已解决)Python在数学计算方面表现得很奇怪,为什么会发生这种情况?,python,numpy,Python,Numpy,我今天很无聊,所以我开始写几分钟的代码来打发时间。无论如何,我想看看x与x的幂和x本身之间的函数关系,所以我写了以下代码 x = np.arange(1,21,1) y = [] for i in x: y.append(len(str(i**i))) plt.plot(x,y,'b') 这看起来很简单,绝对不可能出错,对吧?确实没有错误,但是输出图像是这样的 这太奇怪了,所以我写了以下代码来验证,print(len(str(20**20))但这是正常的,并给出了27的结果 当然,这

我今天很无聊,所以我开始写几分钟的代码来打发时间。无论如何,我想看看x与x的幂和x本身之间的函数关系,所以我写了以下代码

x = np.arange(1,21,1)
y = []
for i in x:
    y.append(len(str(i**i)))
plt.plot(x,y,'b')
这看起来很简单,绝对不可能出错,对吧?确实没有错误,但是输出图像是这样的

这太奇怪了,所以我写了以下代码来验证,
print(len(str(20**20))
但这是正常的,并给出了
27
的结果

当然,这个函数的曲线应该一路飙升,但在
16
20
时存在严重问题。这是Python的问题吗?为什么会这样


感谢巴尔马、斯蒂芬·迈拉巴图拉、伊山和德尔塔。我没想到问题会这么快解决。这确实是一个数据类型问题。我原以为python中的整数不会溢出,但似乎np.int64确实溢出了。

np.arange()
x[I]
的数据类型设置为
int64
,它会为大值溢出<代码>列表(范围(1,21))可以工作。

好问题-x中值的数据类型是np.int64。执行16**16时,您的64位溢出。但是Python的内在int数据类型没有这样的限制。因此,您应该在转换之前将数据强制转换为int:

y.append(len(str(int(i)**int(i))))
或将x定义为整数数组:

x = list(range(1, 21))

numpy
中的数据类型与Python中的不同。
它会溢出,就像C中的
int
一样。

为什么要使用
np.arange()
而不仅仅是
list(范围(1,21)
?如果使用普通的列表,它会工作吗?如果使用
print(y),你会看到什么
?普通列表确实有效,因为Python中的普通整数不会溢出,谢谢Barmar。这就是发生的事情,谢谢Stephen。这就是发生的事情,谢谢delta。这就是发生的事情,谢谢Ishan。我不明白为什么它会溢出,然后我意识到我把它误读为
I*I