在整数数组与浮点数组上使用 ** 进行 numpy 求幂

numpy exponentiation with ** on integer array vs float array

为什么 ** 对浮点数组和整数数组进行运算会有所不同?

  1. ** 整数数组与浮点数组的不同之处是什么?
  2. 这是机器精度的某种舍入问题吗?
  3. 为什么这只是一个数组的问题,而不是我输入它时的问题?

MWE:为什么 f(ns) 不等于 f(fs)

import numpy as np
def f(x):
    a = +x**5
    b = +x**6 
    return a-b

ns = np.array([60])   #integers
fs = np.array([60.])  #floats

print(ns)
print(fs)

print(f(ns))
print(f(fs))

print(int(60)**5- int(60)**6)
print(60.**5 - 60.**6)

导致

[60]
[60.]

[1366240256]
[-4.58784e+10]

-45878400000
-45878400000.0

对于 int 类型,您的系统默认为 np.int32,因此这是一个溢出问题。您需要使用 np.int64 才能正常工作。观察:

In [3]: ns = np.array([60],dtype=np.int32)

In [4]: f(ns)
Out[4]: array([1366240256], dtype=int32)

In [5]: ns = np.array([60],dtype=np.int64)

In [6]: f(ns)
Out[6]: array([-45878400000])

因为np.int32int是不同的东西。换句话说,numpy整数数组的元素不是Python整数。

在Python中,int是任意长度的整数。您可以计算 123**45 并得到一个 90 位以上的整数,正好是 123**45 .

在 numpy 中,数组元素是标准的 32 位或 64 位(有时是 8 位或 16 位)整数,算术运算符是标准的 CPU 算术。在这种情况下,数字几乎可以肯定是有符号或无符号的 32 位。所以它用 32 位整数计算 60**6。由于它不适合 32 位,结果类似于 606 modulo 232.