问题
I've been given a legacy format vtk file (I think its an unstructured grid) and I'd like to read it in with python and output a .npy file instead, since I know how to deal with that.
The file is a dump from ATHENA and so has density, velocity, magnetic field along with the coordinates.
I'm very much a procedural programmer, so all these objects are confusing...
回答1:
Here is the solution that I came up with, the trick was turning on ReadAllVectorsOn().
import numpy
from vtk import vtkStructuredPointsReader
from vtk.util import numpy_support as VN
reader = vtkStructuredPointsReader()
reader.SetFileName(filename)
reader.ReadAllVectorsOn()
reader.ReadAllScalarsOn()
reader.Update()
data = reader.GetOutput()
dim = data.GetDimensions()
vec = list(dim)
vec = [i-1 for i in dim]
vec.append(3)
u = VN.vtk_to_numpy(data.GetCellData().GetArray('velocity'))
b = VN.vtk_to_numpy(data.GetCellData().GetArray('cell_centered_B'))
u = u.reshape(vec,order='F')
b = b.reshape(vec,order='F')
x = zeros(data.GetNumberOfPoints())
y = zeros(data.GetNumberOfPoints())
z = zeros(data.GetNumberOfPoints())
for i in range(data.GetNumberOfPoints()):
x[i],y[i],z[i] = data.GetPoint(i)
x = x.reshape(dim,order='F')
y = y.reshape(dim,order='F')
z = z.reshape(dim,order='F')
回答2:
meshio (a project of mine) knows the VTK format, so you could simply
pip install meshio
and then
import meshio
mesh = meshio.read('file.vtk')
# mesh.points, mesh.cells, ...
回答3:
Here's a script that reads polygon data into numpy arrays from a VTK file using the VTK Python SDK:
import sys
import numpy
import vtk
reader = vtk.vtkPolyDataReader()
reader.SetFileName(sys.argv[1])
reader.Update()
polydata = reader.GetOutput()
for i in range(polydata.GetNumberOfCells()):
pts = polydata.GetCell(i).GetPoints()
np_pts = numpy.array([pts.GetPoint(i) for i in range(pts.GetNumberOfPoints())])
print np_pts
回答4:
Have you tried using paraview? (http://www.paraview.org/) It can give you a visual idea of what is going on behind the scenes and can output the file in a number of different ways. I would suggest this as I don't have a clue what your data is like. http://www.vtk.org/Wiki/VTK/Examples/Python may also have an example that may fit the bill for you. Personally, I'd have a play with paraview and go from there.
回答5:
It should be mentioned that in its latest release, the yt project http://yt-project.org/ includes support for ATHENA, meaning that by all means this is way to analyze the simulation data using python.
回答6:
Here's a short snippet for reading points from legacy VTK files:
import numpy as np
import vtk
filename = 'model.vtk'
reader = vtk.vtkGenericDataObjectReader()
reader.SetFileName(filename)
reader.Update()
points = np.array( reader.GetOutput().GetPoints().GetData() )
The variable points
is an (N,2) or (N,3) array, where N is the number of points.
来源:https://stackoverflow.com/questions/11727822/reading-a-vtk-file-with-python