【问题标题】:Python - Group command in nested listPython - 嵌套列表中的分组命令
【发布时间】:2015-09-19 04:59:58
【问题描述】:

我有一个 2D numpy 数组,其中包含一组由 loadtxt 从文件导入的数据。第一列包含 x 数组,任何其他列包含不同参数的 y 值。我想拟合数据并将拟合参数组合到一个新的二维数组中。这里第一组数据的拟合结果应该作为初始参数来拟合下一组数据。因此,我使用 for 循环来扫描数组的列。

fitparam=zeros((0,3),float)
init_vals=[a,b,c]
for ii in arange(1,data.shape[1]):
    popt,pcov=curve_fit(func,data[:,0],data[:,ii],p0=init_vals)
    init_vals=popt
    fitparam=concatenate((fitparam,resize(popt,(1,3))),axis=0)

有没有更合适的方法来做到这一点,例如使用嵌套列表?因此,我可以避免创建数组 fitparamconcatenate 命令。 比如:

init_vals=[a,b,c]
fitparam=array([
    popt,pcov=curve_fit(func,data[:,0],data[:,ii],p0=init_vals)
    init_vals=popt
    array([popt[0],pcov[0,0],popt[1],pcov[1,1],popt[2],pcov[2,2]])
    for ii in arange(1,data.shape[1])
)]

谢谢

【问题讨论】:

    标签: python arrays list numpy nested


    【解决方案1】:

    您可以使用 data.shape[1] - 1 行初始化一个空数组来存储您的拟合参数,然后在处理数据时逐一填写行:

    fitparam = empty((data.shape[1] - 1, 3), float)
    init_vals = [a, b, c]
    
    for ii in arange(1, data.shape[1]):
        popt, pcov = curve_fit(func, data[:,0], data[:,ii], p0=init_vals)
        init_vals = popt
        fitparam[ii - 1] = popt
    

    这避免了昂贵的数组连接步骤。

    如果您不想存储之前的拟合参数值,那么您需要做的就是保留最新的一组参数,以 p0= 的形式传递给下一次循环迭代:

    popt = [a, b, c]
    
    for ii in arange(1, data.shape[1]):
        popt, pcov = curve_fit(func, data[:,0], data[:,ii], p0=popt)
    

    【讨论】:

    • 谢谢它更好,但我认为我可以避免 for 循环。我喜欢嵌套列表背后的想法。我想我可以将一组 cmets 作为“第一个”参数放入,这些 cmets 将在每次迭代期间进行解释。在我的例子中,拟合过程、拟合参数的传递和参数的输出。
    • 无法避免出现某种循环,因为每次迭代的初始化参数取决于前一次迭代的结果。另一方面,您的代码可能会花费几乎所有时间进行拟合,因此循环不太可能增加任何明显的性能开销。我认为这是一个过早优化的案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-05-23
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多