在整数数组与浮点数组上使用 ** 进行 numpy 求幂
numpy exponentiation with ** on integer array vs float array
为什么 **
对浮点数组和整数数组进行运算会有所不同?
**
整数数组与浮点数组的不同之处是什么?
- 这是机器精度的某种舍入问题吗?
- 为什么这只是一个数组的问题,而不是我输入它时的问题?
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.int32
和int
是不同的东西。换句话说,numpy整数数组的元素不是Python整数。
在Python中,int
是任意长度的整数。您可以计算 123**45
并得到一个 90 位以上的整数,正好是 123**45
.
在 numpy 中,数组元素是标准的 32 位或 64 位(有时是 8 位或 16 位)整数,算术运算符是标准的 CPU 算术。在这种情况下,数字几乎可以肯定是有符号或无符号的 32 位。所以它用 32 位整数计算 60**6
。由于它不适合 32 位,结果类似于 606 modulo 232.
为什么 **
对浮点数组和整数数组进行运算会有所不同?
**
整数数组与浮点数组的不同之处是什么?- 这是机器精度的某种舍入问题吗?
- 为什么这只是一个数组的问题,而不是我输入它时的问题?
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.int32
和int
是不同的东西。换句话说,numpy整数数组的元素不是Python整数。
在Python中,int
是任意长度的整数。您可以计算 123**45
并得到一个 90 位以上的整数,正好是 123**45
.
在 numpy 中,数组元素是标准的 32 位或 64 位(有时是 8 位或 16 位)整数,算术运算符是标准的 CPU 算术。在这种情况下,数字几乎可以肯定是有符号或无符号的 32 位。所以它用 32 位整数计算 60**6
。由于它不适合 32 位,结果类似于 606 modulo 232.