在 python 中查找数组的逆
Finding the inverse of an array in python
我在 Python 中写了一段代码来求数组的逆。我确定代码是正确的,但最后,数组及其逆的乘法给我一个不同于身份的数组,如下所示(a 是数组,a*ainverse 是 a 及其逆相乘的结果) .
a=np.array([[2,3],
[3,2]],
dtype=float)
a.dot(rowequi(a))=[[ 1.00000000e+00 -2.22044605e-16]
[-2.22044605e-16 1.00000000e+00]]
我想问题出在我为条目选择的数据类型 (dtype=float
) 上,但我不知道如何解决它。有什么办法不使用float数据类型就不会遇到这个问题吗?
代码如下:
import numpy as np
a=np.array([[2,3],
[3,2]],
dtype=float)
def rowequi(a):
counter=[]
n=len(a[0])
b=np.empty((n,n+n),dtype=float)
identity=np.empty((n,n),dtype=float)
for i in range(n):
for j in range(n):
if i==j:
identity[i,j]=1
else:
identity[i,j]=0
for k in range(n):
f=list(a[k])
for t in range(n):
f.append(identity[k,t])
b[k]=np.array(f)
for j in range(n):
for i in range(n):
if b[j,i]!=0:
b[j]=(1/b[j][i])*b[j]
counter.append((j,i))
for t in range(n):
if t!=j:
b[t]=b[t]-b[t][i]*b[j]
break
return b
c=np.array([[-0.4, 0.6],
[0.6, -0.4]])
print(c.dot(a))
Is there any way not to use float data type and not to encounter with this problem?
是也不是。
当你取数组的逆时,你会产生本质上任意的分数。您问题中的示例有 −4/10 和 6/10,这些不能用基于二进制的浮点数表示(其中每个可表示的数字都是 2 的幂乘以某个整数,例如 3•2−5 = 3/32)。它们可以用基于十进制的浮点数表示,但逆数组很容易具有 5/7 或 1234/9729102223 等值。所以没有浮点格式能够表示任意数组逆。
有理算术(分数)可以表示整数数组或其他有理数的逆。但它有许多缺点,例如需要支持无限大小的整数以适应出现的任何分母,并且无法表示平方根或正弦等函数的结果。 (我提到有理算术是一种可能的数学解决方案;我不熟悉哪些 Python 功能或包可以支持它。)
还有其他选项,例如符号数学软件,但它们对于您正在处理的问题来说可能有点矫枉过正,而且可能比有理算术更麻烦。
我在 Python 中写了一段代码来求数组的逆。我确定代码是正确的,但最后,数组及其逆的乘法给我一个不同于身份的数组,如下所示(a 是数组,a*ainverse 是 a 及其逆相乘的结果) .
a=np.array([[2,3],
[3,2]],
dtype=float)
a.dot(rowequi(a))=[[ 1.00000000e+00 -2.22044605e-16]
[-2.22044605e-16 1.00000000e+00]]
我想问题出在我为条目选择的数据类型 (dtype=float
) 上,但我不知道如何解决它。有什么办法不使用float数据类型就不会遇到这个问题吗?
代码如下:
import numpy as np
a=np.array([[2,3],
[3,2]],
dtype=float)
def rowequi(a):
counter=[]
n=len(a[0])
b=np.empty((n,n+n),dtype=float)
identity=np.empty((n,n),dtype=float)
for i in range(n):
for j in range(n):
if i==j:
identity[i,j]=1
else:
identity[i,j]=0
for k in range(n):
f=list(a[k])
for t in range(n):
f.append(identity[k,t])
b[k]=np.array(f)
for j in range(n):
for i in range(n):
if b[j,i]!=0:
b[j]=(1/b[j][i])*b[j]
counter.append((j,i))
for t in range(n):
if t!=j:
b[t]=b[t]-b[t][i]*b[j]
break
return b
c=np.array([[-0.4, 0.6],
[0.6, -0.4]])
print(c.dot(a))
Is there any way not to use float data type and not to encounter with this problem?
是也不是。
当你取数组的逆时,你会产生本质上任意的分数。您问题中的示例有 −4/10 和 6/10,这些不能用基于二进制的浮点数表示(其中每个可表示的数字都是 2 的幂乘以某个整数,例如 3•2−5 = 3/32)。它们可以用基于十进制的浮点数表示,但逆数组很容易具有 5/7 或 1234/9729102223 等值。所以没有浮点格式能够表示任意数组逆。
有理算术(分数)可以表示整数数组或其他有理数的逆。但它有许多缺点,例如需要支持无限大小的整数以适应出现的任何分母,并且无法表示平方根或正弦等函数的结果。 (我提到有理算术是一种可能的数学解决方案;我不熟悉哪些 Python 功能或包可以支持它。)
还有其他选项,例如符号数学软件,但它们对于您正在处理的问题来说可能有点矫枉过正,而且可能比有理算术更麻烦。