在 Python 中保存来自 VTK 的数据数组
Save an array of data from a VTK in Python
问题:
如何从 Python 中的 VTK 中提取数据集数组并将其保存在新文件中? 例如 对于具有量级 force、displacement 和 current[ 的数据集的 VTK =41=] 仅提取位移 并将其保存在较小的文件中。
问题:
我在远程服务器上有数百个 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 argument 1: method requires a vtkDataObject, a
vtkFloatArray was provided.
我没有设法将 "vtkFloatArray" 转换为 "vtkDataObject" 或找到支持 "vtkFloatArray" 作为输入的特定方法。我没有找到很多相关代码,但可能是我用谷歌搜索了错误的关键字。此时我卡住了。
注意:
这与在 Paraview 中应用过滤器 "PassArays" 然后保存可以实现的过程相同,但是考虑到我的问题的大小和特征,这不是一个可行的解决方案。
VTK 有一个 vtkPassArrays
过滤器,其文档为 here。您需要知道输出文件中所需数组的名称以及该数组是否为 Point/Cell/Field 数据。
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 integration and 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' )
问题:
如何从 Python 中的 VTK 中提取数据集数组并将其保存在新文件中? 例如 对于具有量级 force、displacement 和 current[ 的数据集的 VTK =41=] 仅提取位移 并将其保存在较小的文件中。
问题:
我在远程服务器上有数百个 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 argument 1: method requires a vtkDataObject, a vtkFloatArray was provided.
我没有设法将 "vtkFloatArray" 转换为 "vtkDataObject" 或找到支持 "vtkFloatArray" 作为输入的特定方法。我没有找到很多相关代码,但可能是我用谷歌搜索了错误的关键字。此时我卡住了。
注意:
这与在 Paraview 中应用过滤器 "PassArays" 然后保存可以实现的过程相同,但是考虑到我的问题的大小和特征,这不是一个可行的解决方案。
VTK 有一个 vtkPassArrays
过滤器,其文档为 here。您需要知道输出文件中所需数组的名称以及该数组是否为 Point/Cell/Field 数据。
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 integration and 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' )