繁体   English   中英

用Python保存VTK中的数据数组

[英]Save an array of data from a VTK in Python

问题

如何从Python中的VTK提取数据集数组并将其保存在新文件中? 例如,对于具有大小, 位移电流数据集的VTK,仅提取位移并将其保存在较小的文件中。

问题

我在远程服务器上有数百个4GB VTK文件,我想提取针对不同幅度生成的几个数据集之一。 在这些数据集中,我有标量和向量。

我编写了以下VTK Python代码,在其中读取了非结构化网格,并获得了第二个数据数组,以后使用“ vtkArrayWriter”将其保存。

import vtk
Filename = 'file.vtk'
reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
reader.Update()
obj = reader.GetOutput().GetPointData().GetArray(1)
writer = vtk.vtkArrayWriter()
writer.SetInputData(obj)
writer.SetFileName('test.vtk')
writer.Update()

该代码为我提供了以下输出:

TypeError:SetInputData参数1:方法需要vtkDataObject,提供了vtkFloatArray。

我没有将“ vtkFloatArray”强制转换为“ vtkDataObject”,也没有找到支持“ vtkFloatArray”的特定方法作为输入。 我没有找到许多相关的代码,但可能是我用错误的关键字在Google上搜索了。 在这一点上,我陷入困境。

注意事项

这是可以通过在Paraview中应用过滤器“ PassArays”然后保存来实现的相同过程,但是鉴于我的问题的大小和特征,这不是可行的解决方案。

VTK有一个vtkPassArrays过滤器,其文档在此处 您需要知道输出文件中所需数组的名称,以及该数组是否为点/单元/字段数据。

import vtk as v
Filename = 'file.vtk'
reader = v.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
pa = v.vtkPassArrays()
pa.SetInputConnection(reader.GetOutputPort())
pa.AddArray( 0, 'Array1Name' ) # 0 for PointData, 1 for CellData, 2 for FieldData
writer = v.vtkDataSetWriter()
writer.SetFileName('test.vtk')
writer.SetInputConnection(pa.GetOutputPort())
writer.Update()
writer.Write()

输出文件test.vtk将包含所有点和单元格,但仅包含您指定的数组名称。 相反,如果只需要数组而不是点或单元格,则可以使用VTK NumPy集成numpy.savetxt进行以下解决方案。

import numpy as np
import vtk as v
from vtk.numpy_interface import dataset_adapter as dsa
reader = v.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
reader.Update()
usg = dsa.WrapDataObject( reader.GetOutput() )
array1 = usg.PointData['Array1Name'] # Assuming you know the name of the array
# array1 is a child class type of numpy.ndarray type
np.savetxt('array1.dat', array1, fmt='%4.5f' )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM