You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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
...

需求:

  1. 如何用Python对该文本文件中的数据进行排序;
  2. 跳过文件前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:56:30