如何从时间序列计算质心y坐标?Pandas与Scipy相关疑问
质心坐标计算问题解答
背景与现有实现
现有形状为N×T的Pandas DataFrame(N=10为样本数,T=6为时间步长):
import pandas as pd import numpy as np from scipy import ndimage data = pd.DataFrame(np.random.random_sample((10, 6)))
需要为每个样本计算质心的x、y坐标,目前已完成x坐标的计算:
time_axis = np.arange(data.shape[1]) centroid_x = np.sum(data.values * time_axis, axis=1) / np.sum(data.values, axis=1)
该结果与scipy.ndimage.center_of_mass处理单行样本的输出一致:
ndimage.center_of_mass(data.loc[0, :].values)
核心疑问解答
1. 为什么center_of_mass只返回单个值?
因为你传入的是一维数组(data.loc[0, :].values的形状为(6,)),center_of_mass对一维输入仅返回该维度上的质心位置;只有传入二维数组时,才会返回(x, y)坐标元组。你计算的centroid_x本质就是这个一维分布(x轴为时间步,每个位置的质量对应行中数值)的质心位置,所以和center_of_mass的输出匹配。
2. 质心y坐标的正确计算方式
你提出的centroid_y = data.values.mean(axis=1)是否正确,取决于你对“质量权重”的定义:
- 若每个时间步的点质量相同(权重为1),则
y坐标确实是行均值,此时质心是所有(x_t, y_t)点的算术平均; - 若遵循你计算
x坐标的逻辑(以每个时间步的y值作为该点的质量权重),则y坐标应为y值的加权平均,权重为y值本身,计算公式为:centroid_y = np.sum(data.values ** 2, axis=1) / np.sum(data.values, axis=1)
结合你补充的样本分布图(曲线为x-时间步、y-对应数值的关系),更合理的是采用第二种加权方式,和x坐标的计算逻辑保持一致。
内容的提问来源于stack exchange,提问作者Murilo
相关产品推荐
相关产品推荐

