Python 如何生成任意长度的numpy.分段函数?(有lambda问题)

Python 如何生成任意长度的numpy.分段函数?(有lambda问题),python,numpy,lambda,piecewise,Python,Numpy,Lambda,Piecewise,我试图绘制一个分段拟合的数据,但我需要用任意数量的线段。有时有三个部分;有时有两种。我将拟合系数存储在actable中,并将分段的边界存储在btable中 以下是我的边界的示例值: btable = [[0.00499999989, 0.0244274978], [0.0244275965, 0.0599999987]] 以下是我的系数的示例值: actable = [[0.0108687987, -0.673182865, 14.6420775], [0.00410866373, -0.05

我试图绘制一个分段拟合的数据,但我需要用任意数量的线段。有时有三个部分;有时有两种。我将拟合系数存储在actable中,并将分段的边界存储在btable中

以下是我的边界的示例值:

btable = [[0.00499999989, 0.0244274978], [0.0244275965, 0.0599999987]]
以下是我的系数的示例值:

actable = [[0.0108687987, -0.673182865, 14.6420775], [0.00410866373, -0.0588355861, 1.07750032]]
我的代码是这样的:

rfig = plt.figure()
<>various other plot specifications<>
x = np.arange(0.005, 0.06, 0.0001)
y = np.piecewise(x, [(x >= btable[i][0]) & (x <= btable[i][1]) for i in range(len(btable))], [lambda x=x: np.log10(actable[j][0] + actable[j][2] * x + actable[j][2] * x**2) for j in list(range(len(actable)))])
plt.plot(x, y)
rfig=plt.figure()
各种其他绘图规范
x=np.arange(0.005,0.06,0.0001)

y=np.分段(x,[(x>=btable[i][0])&(x=btable[i][0])&(x=btable[i][0])&(x这个问题非常常见,Python的官方文档中有一篇文章提供了一个建议的解决方案:创建一个局部变量,由循环变量初始化,以捕获函数中后者的变化值

也就是说,在
y
的定义中,它足以替换

[lambda x=x: np.log10(actable[j][0] + actable[j][1] * x + actable[j][2] * x**2) for j in range(len(actable))]


顺便说一句,可以使用单边不等式指定numpy的范围。分段:计算为True的条件的最后一个将触发相应的函数。(这有点违反直觉;使用第一个True条件会更自然,就像SymPy一样)。如果断点按递增顺序排列,则应使用“x>=”不等式:

breaks = np.arange(0, 10)       # breakpoints
coeff = np.arange(0, 20, 2)     # coefficients to use
x = np.arange(0, 10, 0.1)
y = np.piecewise(x, [x >= b for b in breaks], [lambda x=x, a=c: a*x for c in coeff])

这里,每个系数将用于从相应断点开始的间隔;例如,系数c=0用于范围
0为什么不使用实际的、非
lambda
函数?这与分段函数无关。这是由于。常见的解决方案是使用“工厂函数”为了返回lambda。谢谢!我添加了一个工厂函数,现在它工作正常:def segfunc(I):返回lambda x:np.log10(actable[I][0]+actable[I][1]*x+actable[I][2]*x**2)y=np.分段(x,[(x>=btable[I][0])&(x
[lambda x=x, k=j: np.log10(actable[k][0] + actable[k][1] * x + actable[k][2] * x**2) for j in range(len(actable))]
breaks = np.arange(0, 10)       # breakpoints
coeff = np.arange(0, 20, 2)     # coefficients to use
x = np.arange(0, 10, 0.1)
y = np.piecewise(x, [x >= b for b in breaks], [lambda x=x, a=c: a*x for c in coeff])