为什么 np.array([1e5])**2 和 np.array([100000])**2 在 Python 中结果不同?

5 投票
2 回答
1128 浏览
提问于 2025-04-17 22:20

有人能告诉我为什么 np.array([1e5])**2np.array([100000])**2 不是一样的吗?我来自Matlab,觉得这很困惑!

>>> np.array([1e5])**2
array([  1.00000000e+10])   # correct

>>> np.array([100000])**2
array([1410065408])         # Why??

我发现这种情况从1e5开始,下面的代码给出了正确的结果:

>>> np.array([1e4])**2
array([  1.00000000e+08])   # correct

>>> np.array([10000])**2
array([100000000])          # and still correct

2 个回答

2

你的系统默认使用的是np.int32,这种类型无法处理100000**2这个计算结果。如果你使用64位的精度,就没问题了:

In [6]: np.array([100000], dtype=np.int32)**2
Out[6]: array([1410065408], dtype=int32)

In [7]: np.array([100000], dtype=np.int64)**2
Out[7]: array([10000000000])

默认使用的是32位还是64位,取决于你安装的numpy版本。

7

1e5 是一个浮点数,而 10000 是一个整数:

In [1]: import numpy as np

In [2]: np.array([1e5]).dtype
Out[2]: dtype('float64')

In [3]: np.array([10000]).dtype
Out[3]: dtype('int64')

但是在 numpy 里,整数的位数是固定的(和 Python 自身的整数不同,Python 的整数可以是任意长度的),所以当整数的值超过了允许的最大值时,它们就会“溢出”。

(注意,在你的情况下,你使用的是 32 位的版本,所以实际上后者会给你 dtype('int32'),它的最大值是 2**32-1=2,147,483,647,大约是 2e9,这个值小于 1e10。)

撰写回答