【发布时间】:2020-07-10 17:10:21
【问题描述】:
我正在做一些科学计算,但我找不到执行以下操作的优雅方式。假设我有一个二维numpy 数组D,它在一天中多次存储给定数量的测量值。每行对应不同的测量仪器,每列对应一天中完成测量的不同时刻。
考虑所需百分位数的列表。例如:
quantiles = [0.25, 0.5, 0.75]
我的目标是按百分位组计算一天中每个时刻的平均测量值。换句话说,给定一列测量值,我想将该列中的所有测量值按照上述分位数分组,然后在组内取平均值。使用该示例,我将在一天中的每个时刻有 4 个组:下四分位数的测量值,然后是第 25 个和第 50 个四分位数之间的测量值,第 50 个和第 75 个四分位数之间的测量值,最后是最后一个四分位数的测量值。因此,如果m 是一天中进行测量的时刻数,q 是quantiles 变量中的元素数,我想要的输出将是qxm numpy 数组。
目前,我正在以最低效和最硬编码的方式执行此操作。我们开始:
quantiles = [0.25, 0.5, 0.75]
window = "30min"
moments = pd.date_range(start = "9:30", end = "16:00", freq = window).time
quantile_curves = np.zeros((len(quantiles)+1, len(moments)-1))
EmpQuantiles = np.quantile(D, quantiles, axis = 0)
for moment in range(len(moments)-1):
quantile_curves[0, moment] = np.mean(D[:, moment][D[:,moment] < EmpQuantiles[0, moment]])
quantile_curves[1, moment] = np.mean(D[:, moment][np.logical_and(D[:,moment] > EmpQuantiles[0, moment], D[:,moment] <EmpQuantiles[1, moment])])
quantile_curves[2, moment] = np.mean(D[:, moment][np.logical_and(D[:,moment] > EmpQuantiles[1, moment], D[:,moment] <EmpQuantiles[2, moment])])
quantile_curves[3, moment] = np.mean(D[:, moment][D[:,moment] > EmpQuantiles[2, moment]])
有什么优雅和简单的方法来做到这一点?我在这里找不到答案,但是R 中有一个相关(但不相同)的问题:ddply multiple quantiles by group
我打算绘制一天内组内平均值的演变。我展示了我在下面得到的情节(我对情节感到满意,并且得到了我想要的结果,但是我寻求更好的方法来计算 quantile_curves 变量):
提前非常感谢!
【问题讨论】:
标签: python numpy scientific-computing