如何使用pyvista向VTU文件添加点数据并保存?
用PyVista为VTU文件添加点数据的两种方案
方案一:直接加载VTU并添加新点数据(推荐)
PyVista提供了add_point_data方法,专门用于给网格添加点属性数据,这是最直接高效的方式,无需修改原有数据结构:
import pyvista as pv import numpy as np # 加载目标VTU文件 mesh = pv.read("your_input_file.vtu") # 替换为你生成的9列点数据,确保形状为 (网格点数, 9) # 示例:生成随机测试数据 new_point_data = np.random.rand(mesh.n_points, 9) # 两种添加方式可选: # 1. 将9列数据作为一个多分量点字段添加 mesh.add_point_data(new_point_data, name="MultiComponent_New_Fields") # 2. 将9列拆分为9个独立的单分量点字段 for idx in range(9): mesh.add_point_data(new_point_data[:, idx], name=f"New_Point_Field_{idx+1}") # 保存修改后的VTU文件 mesh.save("output_with_new_points.vtu")
说明:
add_point_data是PyVista网格对象的原生方法,专门用于添加点级属性,和你之前用到的add_field_data(用于全局场数据)完全不同。- 确保新数据的点数和网格的点数严格一致,否则会报错。
方案二:拼接原有点数据后保存
如果需要将原有点数据和新数据拼接成一个大数组再保存,可以按以下步骤操作,但注意这种方式会丢失原有字段的名称(若需保留原字段名,更推荐方案一):
import pyvista as pv import numpy as np # 加载VTU文件 mesh = pv.read("your_input_file.vtu") # 提取所有原有点数据,拼接为一个二维数组 original_point_arrays = [] for field_name in mesh.point_data.keys(): # 将每个单分量字段转为(n,1)形状后加入列表 original_point_arrays.append(mesh.point_data[field_name].reshape(-1, 1)) original_combined = np.hstack(original_point_arrays) # 你的9列新点数据 new_point_data = np.random.rand(mesh.n_points, 9) # 拼接原有数据和新数据 combined_data = np.hstack([original_combined, new_point_data]) # 将拼接后的数据添加回网格(可选两种方式) # 1. 作为一个多分量字段添加 mesh.add_point_data(combined_data, name="Combined_All_Point_Data") # 2. 拆分为单个字段添加(原有字段名称会丢失,仅按序号命名) for idx in range(combined_data.shape[1]): mesh.add_point_data(combined_data[:, idx], name=f"Combined_Field_{idx+1}") # 保存结果 mesh.save("combined_output.vtu")
内容的提问来源于stack exchange,提问作者rnp
相关产品推荐
相关产品推荐

