You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:07:35