
本文介绍一种基于 Pandas 与 NumPy 的高效方法,将每行含多组三维坐标及其对应向量的数据(如 x1 y1 z1 x2 y2 z2 ... data1x data1y data1z ...)重构成“每组坐标+对应向量”为一行的新格式,避免手动切片拼接,适用于大规模节点数据处理。
本文介绍一种基于 pandas 与 numpy 的高效方法,将每行含多组三维坐标及其对应向量的数据(如 `x1 y1 z1 x2 y2 z2 ... data1x data1y data1z ...`)重构成“每组坐标+对应向量”为一行的新格式,避免手动切片拼接,适用于大规模节点数据处理。
在科学计算与数值模拟后处理中,常遇到一类结构化文本数据:每行包含 N 个三维空间坐标(如 x_i y_i z_i)紧随 N 个三维向量分量(如 data_ix data_iy data_iz)。例如,10 个节点对应 30 个坐标值 + 30 个向量值,共 60 列。目标是将原始宽格式(wide format)转换为长格式(long format),使每一行仅表示一个节点的坐标与其对应的向量——即从「1 行 × 60 列」变为「10 行 × 6 列」。
手动索引(如 line_list[0:3] + line_list[30:33])虽可行,但硬编码列号易出错、难以维护,且无法灵活适配不同节点数(如从 10 节点切换到 50 节点)。推荐使用 pandas + numpy 的向量化方案,兼具可读性、健壮性与性能优势。
核心思路如下:
-
统一加载:用
pd.read_csv(..., sep=r'\s+', header=None)读取空格/制表符分隔的纯文本,生成形状为(n_rows, total_cols)的 DataFrame; -
重塑结构:利用
.values.reshape(-1, n_nodes, 6)将每行数据拆分为n_nodes组,每组含 6 列(3 坐标 + 3 向量); -
重组行序:通过
np.hstack沿列方向拼接所有组,再转为 DataFrame,自然实现“每节点一行”。
假设每行含 n 个节点(即 3n 个坐标列 + 3n 个向量列 = 6n 列),通用代码如下:
import pandas as pd
import numpy as np
from io import StringIO
# 示例:替换为实际文件路径
file_path = "input_data.txt"
# 步骤1:读取全部数据(跳过首行标题可加 skiprows=1)
df = pd.read_csv(file_path, sep=r'\s+', header=None, skiprows=1)
# 步骤2:设定节点数(此处 n=3;实际中根据需求修改,如 n=10)
n_nodes = 10 # ✅ 根据你的数据调整此值
# 步骤3:将每行 reshape 为 (n_nodes, 6),再水平堆叠所有行
# df.values.shape = (n_rows, 6*n_nodes) → reshape(-1, n_nodes, 6) → (n_rows, n_nodes, 6)
reshaped = df.values.reshape(-1, n_nodes, 6)
stacked = np.hstack([reshaped[:, i, :] for i in range(n_nodes)]) # 形状: (n_rows * n_nodes, 6)
# 步骤4:构造结果 DataFrame 并保存
result_df = pd.DataFrame(stacked, columns=['x', 'y', 'z', 'vx', 'vy', 'vz'])
result_df.to_csv("reformatted_output.csv", index=False, float_format="%.6f")
⚠️ 注意事项:
reshape(-1, n_nodes, 6)中-1自动推导行数,确保total_cols == 6 * n_nodes,否则会报错——建议先校验:assert df.shape[1] % 6 == 0;- 若文件含非数值标题行(如
# Node Data),务必通过skiprows或comment='#'过滤;- 对于超大文件(GB 级),可改用
chunksize分块处理,避免内存溢出;- 列名(如
'x','y','z','vx','vy','vz')应按实际物理意义命名,增强可读性。
该方法完全向量化,无需 Python 循环,处理数千行 × 十节点数据时速度显著优于逐行 split() + 手动切片。同时,逻辑清晰、参数集中(仅需配置 n_nodes),易于复用与扩展——无论是处理 5 节点的简化测试集,还是 100 节点的工业级网格数据,只需调整一个变量即可生效。










