如何在NumPy中创建并保留分数形式的矩阵以用于计算
保留NumPy矩阵中的分数形式用于精确计算
要在矩阵中保留分数形式并进行精确计算,你有两种常用的方案,具体选择取决于你是否需要符号化的变量(比如保留alpha作为参数):
方案1:使用Python标准库的fractions.Fraction(适合数值分数运算)
Python的fractions模块可以创建精确的分数对象,我们可以让NumPy数组以object类型存储这些分数,避免转成浮点数丢失精度。修改你的代码如下:
import numpy as np from fractions import Fraction alpha = 10 B = np.array([ [Fraction(0), Fraction(-1, 4), Fraction(-1, 20), Fraction(alpha, 40)], [Fraction(1, alpha+3), Fraction(0), Fraction(-1, alpha+3), Fraction(-(alpha-1), alpha+3)], [Fraction(1, 2*alpha+2), Fraction(1, alpha+1), Fraction(0), Fraction(1, 10*alpha+10)], [Fraction(-1, 2), Fraction(-9, 20), Fraction(0), Fraction(0)] ], dtype=object) print(B)
运行后输出会是精确的分数形式:
[[0 -1/4 -1/20 1/4] [1/13 0 -1/13 -9/13] [1/22 1/11 0 1/110] [-1/2 -9/20 0 0]]
为什么原来的代码不行?
你原来的代码中,1/20、alpha/40这类表达式在Python中会直接计算为浮点数(比如1/20=0.05),NumPy数组默认会把所有元素统一为浮点数类型,自然就丢失了分数的精确表示,甚至可能因为显示精度问题出现奇怪的截断结果。
方案2:使用SymPy库(适合符号化运算)
如果你需要保留alpha作为符号变量,或者要进行更复杂的代数运算,SymPy是更好的选择,它支持符号矩阵和精确分数:
import sympy as sp # 定义符号变量alpha alpha = sp.symbols('alpha') B = sp.Matrix([ [0, -sp.Rational(1,4), -sp.Rational(1,20), alpha/40], [1/(alpha+3), 0, -1/(alpha+3), -(alpha-1)/(alpha+3)], [1/(2*alpha+2), 1/(alpha+1), 0, 1/(10*alpha+10)], [-sp.Rational(1,2), -sp.Rational(9,20), 0, 0] ]) # 输出符号矩阵 print("符号矩阵:") print(B) # 代入alpha=10得到具体分数矩阵 print("\n代入alpha=10后的矩阵:") print(B.subs(alpha, 10))
输出会保留符号或精确分数,完全满足后续的精确计算需求。
注意事项
- 使用
Fraction的object数组时,NumPy部分高级函数可能不兼容,但基本的矩阵加减乘运算都能正常进行,且结果保持分数精度。 - 如果后续需要转成浮点数,只需调用
B.astype(float)即可,但这会丢失分数的精确性。
内容的提问来源于stack exchange,提问作者flowian
相关产品推荐
相关产品推荐

