在Python中从文件中提取多项式系数

5vf7fwbs  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(326)

我最近一直在使用包含如下数据的文本文件:

A = a_0 + a_1*x + ... + a_l*x^l
B = b_0 + b_1*x + ... + b_m*x^m
.
.
.
G = g_2*x^2 + g_n

其中l和m不一定相同,并且B可能不是最长的方程。是否有方法将系数导入NumPy数组,在缺少系数的地方插入0,以便上面的示例将产生

我最初考虑使用numpy.genfromtxt,其中x填充为1(这样只有系数保留),但这样做的问题是,我们会丢失系数所在的列和行。非常感谢您的帮助。

nkhmeac6

nkhmeac61#

这是一种非常自定义的文本类型,您必须编写一个解析器来实现:
考虑到要读取txt文件,例如这里的s,您可能必须从文件with open('..') as fid ...中读取

s  = """A =  2*x  + 3*x^5
B = 3 + 2*x  + 3*x^5
C = 8 + 20*x  + 3*x^9"""

就像这样:

equations = s.split('\n')

def parse_lines(s):
    def foo(val):
        coef, _power,*_ = *val.split('*'), '^'  #  parse a_0*x^n 
        x, power, *_ =  *_power.split('^'), '1' #  parse x^n
        power = 0 if not power else power 
        return int(coef) , int(power)
    
    _, eq = s.split('=')
    return  [foo(item) for item in eq.split('+')]
 

indexes = [(idx, *t)  for idx, eq in enumerate(equations) for t in parse_lines(eq)]

输出:(行,瓦尔,列)

[(0, 2, 1),
 (0, 3, 5),
 (1, 3, 0),
 (1, 2, 1),
 (1, 3, 5),
 (2, 8, 0),
 (2, 20, 1),
 (2, 3, 9)]

你可以解析成一个可以重构成数组的格式。2之后就很简单了,只需要构建数组:

m, _, n = np.array(d).max(axis=0)
m , n = m + 1, n + 1
arr = np.zeros((m,n))
for row, val, col in indexes:
    arr[row, col] = val

输出:

array([[ 0.,  2.,  0.,  0.,  0.,  3.,  0.,  0.,  0.,  0.],
       [ 3.,  2.,  0.,  0.,  0.,  3.,  0.,  0.,  0.,  0.],
       [ 8., 20.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  3.]])

相关问题