评估 numpy 数组时的两个不同值

Two differents values when evaluating a numpy array

我有一个非常基本的问题。

import numpy as np

def u(x):
    return 1 - x + x**2 - x**3 + x**4 - x**5 + x**6 - x**7 + x**8 - x**9 + x**10

X = np.array([8, 9])
Y = u(X)
print("u(8) = ", u(X)[0], "or", u(8))
print("u(9) = ", u(X)[1], "or", u(9))

我创建了一个包含 8 和 9 的数组,然后将函数“u”应用于该数组。但出于某种原因 u(X)[1] != u(9) (即使 X[1] == 9):

u(8) =  954437177 or 954437177
u(9) =  -1156861335 or 3138105961

奇怪的是,当 n < 9 时我没有这个问题。这里有什么问题吗? (还有我...)

Numpy 在内部不使用 Python 任意精度数字类型,但(通常)使用机器数字。在这种情况下,您创建的数组 X 自动获得 32 位整数作为它们的类型。对于那些,你的函数溢出了。我无法在 Python 中轻松证明这一点,但在 Julia 中效果相同:

julia> u(Int32(9))
-1156861335

julia> u(Int32(8))
954437177

julia> u(Int64(9))
3138105961

julia> u(Int64(8))
954437177

julia> typemax(Int32)
2147483647

解决方法是明确地告诉np.array你想使用什么类型:

In [2]: X = np.array([8, 9], dtype=float)

In [4]: u(X)
Out[4]: array([9.54437177e+08, 3.13810596e+09])

In [5]: X = np.array([8, 9], dtype=np.int64)

In [6]: u(X)
Out[6]: array([ 954437177, 3138105961])

# you can use Python integers, but it's going to lose efficiency!
In [8]: X = np.array([8, 9], dtype=object)

In [9]: u(X)
Out[9]: array([954437177, 3138105961], dtype=object)

# for comparison
In [22]: X = np.array([8, 9], dtype=np.int32)

In [25]: u(X)
Out[25]: array([  954437177, -1156861335], dtype=int32)