我是使用sympy库的新手,在定义公式后我无法计算平均值:
import sympy as sp
import numpy as np
sp.init_printing()
mu, N, i, x_i = sp.symbols( 'mu N i x_i' )
mu_form = sp.Eq( mu , (1/N) * sp.Sum( x_i, (i, 1, N) ) )
现在我想为x_i
定义一个值列表,以实际计算平均值。我尝试过这种方式,但它似乎无法正常工作:
x_i_val = (1, 1, 3, 3, 2, 2, 2, 2)
mu_val = mu_form.subs( [(x_i, x_i_val), (N, 8)] )
我对mean
并不感兴趣,我想了解计算这样一个公式结果的方法,并在里面加总。
在找到可用教程和Google搜索中的最小示例时,我没有运气。
答案 0 :(得分:2)
符号x_i
与符号i
无关。它打印有下标,但这只是一个打印惯例。
更好的选择是IndexedBase
。来自https://github.com/sympy/sympy/pull/8065的修复程序使这更容易,但是现在,您可以执行以下操作:
In [13]: x = IndexedBase('x')
In [14]: mu_form = sp.Eq( mu , (1/N) * sp.Sum( x[i], (i, 1, N) ) )
In [15]: mu_form = mu_form.subs(N, 8).doit()
这会扩大总和,以便您可以替换术语:
In [16]: mu_form
Out[16]:
x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8]
μ = ──── + ──── + ──── + ──── + ──── + ──── + ──── + ────
8 8 8 8 8 8 8 8
In [20]: mu_form = mu_form.subs({x[i]: x_i_val[i - 1] for i in range(1, 9)})
In [21]: mu_form
Out[21]: μ = 2
顺便说一句,如果你将索引设置为0而不是1,那么处理事情要容易得多,因为这就是Python所做的事情。