2024-04-26 09:19:29 发布
网友
numpy有一个方法来反转矩阵。但是我有一个矩阵,它有大量的整数项,而且矩阵是幺模的,所以逆矩阵也是一个整数矩阵。如果仅仅使用numpy用float计算,然后对值进行四舍五入,误差就太大了。有没有一种方法可以用整数或任何其他库精确计算条目?在
您可以使用^{}。在
例如,下面是一个numpy整数数组:
In [148]: m = np.array([[10, 11, 0, 0], [9, 10, 0, 0], [100, 0, 20, 3], [-10000, 200, 133, 20]]) In [149]: m Out[149]: array([[ 10, 11, 0, 0], [ 9, 10, 0, 0], [ 100, 0, 20, 3], [-10000, 200, 133, 20]])
精确的行列式是1,但是np.linalg.det()和np.linalg.inv()都会引入浮点错误:
np.linalg.det()
np.linalg.inv()
从numpy数组创建一个sypy ^{}对象:
In [156]: import sympy In [157]: M = sympy.Matrix(m) In [158]: M Out[158]: Matrix([ [ 10, 11, 0, 0], [ 9, 10, 0, 0], [ 100, 0, 20, 3], [-10000, 200, 133, 20]])
sympy计算是精确的:
In [159]: M.det() Out[159]: 1 In [160]: M.inv() Out[160]: Matrix([ [ 10, -11, 0, 0], [ -9, 10, 0, 0], [-325400, 358000, 20, -3], [2169000, -2386300, -133, 20]])
要将逆矩阵转换回numpy数组,可以执行以下操作:
In [185]: Minv = M.inv() In [186]: minv = np.asarray(Minv).astype(int) In [187]: minv Out[187]: array([[ 10, -11, 0, 0], [ -9, 10, 0, 0], [ -325400, 358000, 20, -3], [ 2169000, -2386300, -133, 20]])
必须使用astype(int)方法,因为numpy数组中没有object的数据类型:
astype(int)
object
In [188]: np.asarray(Minv) Out[188]: array([[10, -11, 0, 0], [-9, 10, 0, 0], [-325400, 358000, 20, -3], [2169000, -2386300, -133, 20]], dtype=object)
这个结果是一个整数的整数数组。在
在转换回numpy时要小心:逆整数可能比用64位整数表示的大。在
您可以使用^{} 。在
例如,下面是一个numpy整数数组:
精确的行列式是1,但是
^{pr2}$np.linalg.det()
和np.linalg.inv()
都会引入浮点错误:从numpy数组创建一个sypy ^{} 对象:
sympy计算是精确的:
要将逆矩阵转换回numpy数组,可以执行以下操作:
必须使用
astype(int)
方法,因为numpy数组中没有object
的数据类型:这个结果是一个整数的整数数组。在
在转换回numpy时要小心:逆整数可能比用64位整数表示的大。在
相关问题 更多 >
编程相关推荐