如何基于稀疏存储的时序x/y数据构建完整张量数据集
实现思路
- 第一步:采集所有时间点的x值,去重后升序排序,得到全局统一的x轴序列
- 第二步:将每个时间点的(x,y)对转换为哈希查找表(字典),O(1)时间判断x是否存在对应y值
- 第三步:对每个时间点,遍历全局x序列,从哈希表取值,不存在则补0,生成对应y序列
- 第四步:将全局x序列和所有时间点的y序列拼接成目标矩阵
纯Python实现(无额外依赖)
适合中小规模数据集,不需要安装第三方库:
# 输入示例:任意数量时间点的存储数据,结构为[(x_list, y_list), (x_list, y_list), ...] time_series = [ ([200, 201, 203, 206, 207], [5, 10, 7, 15, 20]), # t0 ([201, 204, 206, 207], [10, 15, 3, 20]) # t1 ] # 1. 收集所有x值去重后排序 all_x = set() for x_list, _ in time_series: all_x.update(x_list) sorted_x = sorted(all_x) # 2. 逐时间点生成补0后的y序列 result = [sorted_x] for x_list, y_list in time_series: lookup_dict = dict(zip(x_list, y_list)) full_y = [lookup_dict.get(x, 0) for x in sorted_x] result.append(full_y) print(result) # 输出:[[200, 201, 203, 204, 206, 207], [5, 10, 7, 0, 15, 20], [0, 10, 0, 15, 3, 20]]
大数据量优化方案(Pandas向量化实现)
如果是百万级以上的x值、数十个以上时间点的大规模数据集,用Pandas向量化操作效率更高:
import pandas as pd time_series = [ ([200, 201, 203, 206, 207], [5, 10, 7, 15, 20]), ([201, 204, 206, 207], [10, 15, 3, 20]) ] dfs = [] for time_idx, (x_list, y_list) in enumerate(time_series): dfs.append(pd.DataFrame({"x": x_list, f"t{time_idx}": y_list})) # 外连接合并所有数据,缺失值补0,转成目标列表结构 full_df = pd.concat(dfs).groupby("x", as_index=False).sum(numeric_only=True).sort_values("x") result = full_df.values.T.tolist()
方案优势
- 时间复杂度低,整体效率远高于嵌套循环匹配的实现
- 支持任意数量的时间点输入,不需要修改代码逻辑
- 输出结构完全匹配要求的矩阵格式
内容的提问来源于stack exchange,提问作者Állan Ferrari
相关产品推荐
相关产品推荐

