在循环中应用曲线拟合

2024-06-17 12:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

如前所述,我在将函数拟合到循环中的数据时遇到了一个问题。这是dataframe中的groupby对象。此groupby对象具有以下结构:

    f [MHz] T [K]   Rs
0   400 1.75    13.472493
1   400 2.00    14.054298
2   400 2.25    14.900821
3   400 2.50    16.453007
4   400 2.75    18.050460
13  800 1.75    36.008499
14  800 2.00    37.924344
15  800 2.25    41.246962
16  800 2.50    45.780308
17  800 2.75    51.904333
26  1200    1.75    53.809458
27  1200    2.00    61.427391
28  1200    2.25    67.438682
29  1200    2.50    75.302240
30  1200    2.75    88.015202

现在,我想对每个频率组(400、800和1200)应用一个拟合,并在一个循环中高效地执行此操作。第一次尝试是:

^{pr2}$

我从0运行到2来创建T1、Rs1、T2、Rs2等等。该条件将T值限制在某个范围内,这似乎可以正常工作。但是,我无法将曲线拟合程序正确地应用于所有三个频率组-它引发了以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-14-0b3b4adc65e7> in <module>()
     24 i = 0
     25 for freq, grp1 in RT1.groupby(['f [MHz]']):
---> 26     T[i] = grp1['T [K]'].values[condition]
     27     Rs[i]= grp1['Rs'].values[condition]
     28     popt[i], pcov[i] = curve_fit(RsT, T[i], Rs[i], p0)

ValueError: setting an array element with a sequence.

问题是,我没有为每个组分配三个不同的T和Rs数组-我希望T1和Rs1的值为400mhz,T2和Rs2的值为800mhz,依此类推。另外,popt和pcov应分别计算三次(popt1,pcov1;pop2,pcov2;…),分别对应于每个数据组的单独拟合。 我希望,有人可以解释,如果有可能在一个循环中应用曲线拟合程序,如果可以-怎么做。 非常感谢!在


Tags: 数据对象in程序频率t1groupbyrs
1条回答
网友
1楼 · 发布于 2024-06-17 12:27:57

听起来TRsT都是非对象数据类型的numy数组。试图为T的一个单元格分配一个值数组会引发您看到的ValueError:

In [117]: T = np.zeros(3)

In [118]: T[0] = np.arange(10)
ValueError: setting an array element with a sequence.

可以使用object dtype数组

^{pr2}$

但是对象数组并不是特别快;您可以制作T和{}列表。在

相关问题 更多 >