20

我得到了一个旧格式的 vtk 文件(我认为它是一个非结构化网格),我想用 python 读取它并输出一个 .npy 文件,因为我知道如何处理它。

该文件是来自 ATHENA 的转储文件,因此具有密度、速度、磁场以及坐标。

我是一个非常程序化的程序员,所以所有这些对象都令人困惑......

4

6 回答 6

21

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')
于 2012-08-13T21:15:04.410 回答
12

meshio(我的一个项目)知道 VTK 格式,所以你可以简单地

pip install meshio

接着

import meshio
mesh = meshio.read('file.vtk')
# mesh.points, mesh.cells, ...
于 2017-05-18T17:52:39.527 回答
9

这是一个使用 VTK Python SDK 将多边形数据从 VTK 文件中读取到 numpy 数组中的脚本:

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
于 2012-08-10T01:31:02.247 回答
4

值得一提的是,在其最新版本中,yt 项目http://yt-project.org/包括对 ATHENA 的支持,这意味着无论如何这是使用 python 分析模拟数据的方式。

于 2013-08-15T00:54:32.113 回答
4

你试过用paraview吗?(http://www.paraview.org/) 它可以让您直观地了解幕后发生的事情,并且可以以多种不同的方式输出文件。我建议这样做,因为我不知道您的数据是什么样的。http://www.vtk.org/Wiki/VTK/Examples/Python也可能有一个适合您的示例。就个人而言,我会玩 paraview 并从那里开始。

于 2012-07-31T23:01:16.043 回答
4

这是从旧 VTK 文件中读取点的简短片段:

import numpy as np
import vtk

filename = 'model.vtk'

reader = vtk.vtkGenericDataObjectReader()
reader.SetFileName(filename)
reader.Update()

points = np.array( reader.GetOutput().GetPoints().GetData() )

变量points是 (N,2) 或 (N,3) 数组,其中 N 是点数。

于 2018-09-14T09:39:09.247 回答