如何用Python排序并处理流体模拟文本数据以实现分组绘图?
问题
我有一个约13万行的流体模拟文本文件,格式示例如下:
256 8 8 8 0.0000000E+00 0 X Y Z U P NELT,NX,NY,N 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 3.000000E-01 0.000000E+00 3.409659E-01 5.036753E-02 0.000000E+00 0.000000E+00 1.505282E-01 5.081596E-02 1.505282E-01 4.801647E-01 ...
需求:
- 如何用Python对该文本文件中的数据进行排序;
- 跳过文件前44行,将后续每行的7个数值分别对应
x-coordinate、y-coordinate、z-coordinate、x-velocity、y-velocity、z-velocity、pressure字段进行分组,用于绘制如x velocity vs x-coordinate的图表。目前已成功跳过前44行,但无法完成数据分组。
解决方案
一、数据分组(解决当前核心问题)
针对13万行的大数据量,推荐两种实现方式:
方法1:纯Python原生处理(无需额外依赖)
用内置文件操作和列表存储数据,适合不想安装第三方库的场景:
# 初始化对应字段的空列表 x_coord = [] y_coord = [] z_coord = [] x_vel = [] y_vel = [] z_vel = [] pressure = [] # 打开文件处理 with open('fluid_data.txt', 'r') as f: # 跳过前44行 for _ in range(44): next(f) # 遍历剩余行提取数据 for line in f: # 去除首尾空白,按任意数量空格分割数值(自动处理多空格分隔) values = line.strip().split() # 过滤格式异常的行(确保每行有7个数值) if len(values) == 7: # 转换为浮点数并分配到对应列表 x_coord.append(float(values[0])) y_coord.append(float(values[1])) z_coord.append(float(values[2])) x_vel.append(float(values[3])) y_vel.append(float(values[4])) z_vel.append(float(values[5])) pressure.append(float(values[6]))
处理完成后可直接用这些列表绘图,示例如下:
import matplotlib.pyplot as plt plt.scatter(x_coord, x_vel, s=1) plt.xlabel('X Coordinate') plt.ylabel('X Velocity') plt.title('X Velocity vs X Coordinate') plt.show()
方法2:使用Pandas(高效处理大数据)
Pandas对结构化数据的处理效率更高,代码更简洁,适合13万行规模:
import pandas as pd # 定义字段名称 column_names = [ 'x-coordinate', 'y-coordinate', 'z-coordinate', 'x-velocity', 'y-velocity', 'z-velocity', 'pressure' ] # 读取文件,跳过前44行,按空格分割数据 df = pd.read_csv( 'fluid_data.txt', skiprows=44, sep='\s+', # 适配任意数量空格的分隔符 names=column_names, dtype='float64' )
此时df是结构化的DataFrame,直接用于绘图:
import matplotlib.pyplot as plt plt.scatter(df['x-coordinate'], df['x-velocity'], s=1) plt.xlabel('X Coordinate') plt.ylabel('X Velocity') plt.title('X Velocity vs X Coordinate') plt.show()
二、数据排序
排序基于分组后的数据实现,两种方式如下:
纯Python排序
以按x-coordinate升序排序为例,需要先打包数据再拆分:
# 将所有字段打包成元组列表 data = list(zip(x_coord, y_coord, z_coord, x_vel, y_vel, z_vel, pressure)) # 按x-coordinate(元组第一个元素)升序排序 sorted_data = sorted(data, key=lambda item: item[0]) # 拆分回各个字段列表 x_coord_sorted, y_coord_sorted, z_coord_sorted, x_vel_sorted, y_vel_sorted, z_vel_sorted, pressure_sorted = zip(*sorted_data) # 转换为列表(zip返回的是元组) x_coord_sorted = list(x_coord_sorted) x_vel_sorted = list(x_vel_sorted)
Pandas排序
直接调用sort_values方法,支持单字段或多字段排序:
# 按x-coordinate升序排序 df_sorted = df.sort_values(by='x-coordinate') # 按x-coordinate升序、y-coordinate降序排序 df_sorted = df.sort_values(by=['x-coordinate', 'y-coordinate'], ascending=[True, False])
排序后的DataFrame可直接用于后续分析或绘图。
内容的提问来源于stack exchange,提问作者JPattison
相关产品推荐
相关产品推荐

