Python如何提取嵌套列表各子列表对应元素并计算均值与组合标准差
问题说明
你有两个结构完全相同的嵌套列表,内容如下:
x = [[array([1.39555504e-06, 3.92652210e-04, 1.25352408e-01, 2.14678565e+01])], [array([1.67217238e-07, 3.88075043e-04, 1.26022677e-01, 2.41765099e+01])], [array([6.95260542e-07, 3.86892681e-04, 1.25952180e-01, 2.39032518e+01])]]
sd_x = [[array([2.20316800e-06, 3.16566115e-06, 5.58783598e-04, 2.23978679e+00])], [array([2.15490637e-06, 3.13506583e-06, 5.47878385e-04, 2.22232169e+00])], [array([2.15498845e-06, 3.12207305e-06, 5.50507349e-04, 2.25939186e+00])]]
你需要计算所有子列表第i个对应位置元素的均值,例如所有子列表第一个元素[1.39555504e-06, 1.67217238e-07, 6.95260542e-07]的均值,同时结合sd_x中存储的对应标准差,计算均值的综合标准差。
目前已实现可正常运行的均值计算代码:
mean = np.array([np.mean(list(np.array(fit_sin).T[0])),np.mean(list(np.array(fit_sin).T[1])),\ np.mean(list(np.array(fit_sin).T[2])),np.mean(list(np.array(fit_sin).T[3]))]);
现在需要按照公式st_dev= sqrt (sum (x[ij]/sd_x[ij])**2 )实现标准差的计算,其中每个子列表长度i=4,外层列表长度j=3。
实现方案
首先可以先将嵌套列表转换为numpy数组并去掉多余的维度,简化后续计算逻辑,不用手动逐个索引遍历:
import numpy as np # 拉平原始数据的多余维度,转换后形状为 (3,4),3行对应外层3个元素,4列对应每个数组的4个值 x_arr = np.squeeze(np.array(x)) sd_x_arr = np.squeeze(np.array(sd_x)) # 原有均值计算可以简化为一行,效果和你现有代码完全一致 mean = x_arr.mean(axis=0) # 按给定公式计算综合标准差,axis=0表示按列聚合计算,最终得到长度为4的结果数组,和mean一一对应 st_dev = np.sqrt(np.sum((x_arr / sd_x_arr)**2, axis=0))
如果你希望和原有代码风格保持一致,逐个索引计算也可以用如下写法:
st_dev = np.array([ np.sqrt(np.sum((x_arr[:,0]/sd_x_arr[:,0])**2)), np.sqrt(np.sum((x_arr[:,1]/sd_x_arr[:,1])**2)), np.sqrt(np.sum((x_arr[:,2]/sd_x_arr[:,2])**2)), np.sqrt(np.sum((x_arr[:,3]/sd_x_arr[:,3])**2)) ])
以上实现完全匹配你给出的公式规则,如果你后续需要调整为加权平均对应的标准差,可以在此基础上修改聚合逻辑即可。
内容的提问来源于stack exchange,提问作者Krystal
相关产品推荐
相关产品推荐

