Numpy 为什么我在计算一个所有正数都是1024次方的矩阵时会得到负值?

Numpy 为什么我在计算一个所有正数都是1024次方的矩阵时会得到负值?,numpy,matrix,matrix-multiplication,Numpy,Matrix,Matrix Multiplication,我正在计算一个非常简单的2*2矩阵a=([[3,2],[1,4]]),它的幂为1024。我使用的是一个numpy函数np.linalg.matrix_幂(a,1024)。正如您所看到的,这个矩阵中没有负数,但是Python返回负数的值 我在不同的计算机上尝试过,但它仍然返回负值 将numpy导入为np A=np.数组([[3,2],[1,4]] A_1024=np.linalg.matrix_幂(A,1024) 结果是 array([[-1201800533, 1891366230],

我正在计算一个非常简单的2*2矩阵a=([[3,2],[1,4]]),它的幂为1024。我使用的是一个numpy函数np.linalg.matrix_幂(a,1024)。正如您所看到的,这个矩阵中没有负数,但是Python返回负数的值

我在不同的计算机上尝试过,但它仍然返回负值

将numpy导入为np
A=np.数组([[3,2],[1,4]]
A_1024=np.linalg.matrix_幂(A,1024)
结果是

array([[-1201800533,  1891366230],
       [-1201800533,  1891366230]])

我期望所有正数的值,但为什么它返回负值?

事实上这些值都是正值,这是正确的。然而,Numpy在这里使用这些数字的32位整数表示(在64位机器上,可能使用64位数字)

这意味着数组只能包含-231和231-1之间的数字作为值。如果使用较大的数字进行计算,则通常会发生换位运算,执行算术运算,最后的32位数字将被重新解释为有符号的32位数字

例如,我们可以使用128位浮点数来获得值的近似值:

>>> A = np.array([[3,2],[1,4]], dtype=np.float128)
>>> np.linalg.matrix_power(A, 1024)
array([[1.85422822e+715, 3.70845643e+715],
       [1.85422822e+715, 3.70845643e+715]], dtype=float128)
>A=np.array([[3,2],[1,4]],dtype=np.float128)
>>>np.linalg.matrix_幂(A,1024)
阵列([[1.85422822e+715,3.70845643e+715],
[1.85422822e+715,3.70845643e+715]],dtype=float128)
在这里,我们看到这些数字大约是1.854×10715和3.708×10715,这是巨大的数字。32位数字最多只能表示2'147'483'647的值,因此远低于实际值

对于64位浮点数,这甚至不再是可表示的,因此使用无穷大:

>>> A = np.array([[3,2],[1,4]], dtype=np.float64)
>>> np.linalg.matrix_power(A, 1024)
array([[inf, inf],
       [inf, inf]])
>A=np.array([[3,2],[1,4]],dtype=np.float64)
>>>np.linalg.matrix_幂(A,1024)
数组([[inf,inf],

[inf,inf]]
Wrap arounds,如果一个数字变大,则只使用最后的32位。@Willem所说的-您试图存储的数字对于数据类型(int)来说太大了,因此它会截断结果(有时结果似乎是负数,即使它们不应该是负数)
a
是一个整数数组(32位或64位,取决于您的平台)。下面是一个简单的8位环绕示例:
np.array([10,30,61],dtype=np.int8)**2
返回
array([100,-124,-119],dtype=int8)
。将
a
更改为浮点,然后重试,例如
a=np.array([3,2],[1,4]],dtype=np.float64)
。但是当你发现结果都是
inf
时,不要惊讶!@WarrenWeckesser:尝试
float64
很有启发性,但也不会产生想要的结果。@WillemVanOnsem:噢,哇,我不知道
float128
甚至是件事。谢谢你指出这一点。