2012-07-30 152 views
13

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

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

我非常一个程序的程序员,所以所有这些对象都是混乱...

+3

你能发布这个文件的数据的样本? – 2012-07-30 19:04:32

+0

有[PyEVTK](https://bitbucket.org/pauloh/pyevtk)写作,但它不支持阅读 – jterrace 2012-07-30 19:07:53

+0

哦,从jterrace的链接,我看到它是一种二进制格式。的Bleh。 – 2012-07-30 19:23:45

回答

4

您是否尝试过使用paraview包? (http://www.paraview.org/)它可以给你一个关于幕后发生的事情的视觉概念,并且可以用许多不同的方式输出文件。我会建议这个,因为我不知道你的数据是什么样的。 http://www.vtk.org/Wiki/VTK/Examples/Python也可能有一个可能适合您的账单的例子。就我个人而言,我会和paraview一起玩,然后从那里出发。

+1

我以前使用过paraview,或者更确切地说是一个名为VISIT的加法。但是,我需要分析文件中的内容,并执行诸如fft等的操作,因此只是简单地对其进行可视化是不够的。 – 2012-08-01 13:16:26

4

这里有一个脚本,使用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 
+0

我已经能够使用vtkDataSetReader()而不是vtkPolyDataReader进入GetOutput()阶段,但我仍然对如何获取信息感到困惑。 GetNumberOfPoints和GetNumberOfCells似乎给了我认为数组应该有多大的合理数字,但我仍然不知道如何将所有变量拉出来。 有没有办法获得有关vtk究竟具有什么内容以及以什么形式存在的信息?用一种可以理解的方式? – 2012-08-10 19:34:26

+0

如果你选择这里的一个文件http://people.sc.fsu.edu/~jburkardt/data/vtk/vtk.html我可以尝试并帮助提取格式。有很多不同的格式。 – jterrace 2012-08-10 19:40:16

+0

reader.IsFileStructuredPoints()返回1,其他选项返回0,所以我要走出去并说它是一个结构化点的传统vtk。 – 2012-08-10 20:45:13

13

这里是我想出了,关键是()打开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') 
4

应该提到的是,在最新版本中,YT项目http://yt-project.org/包括ATHENA支持,这意味着通过各种手段,这是使用Python分析仿真数据的方式。

2

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

pip install meshio 

然后

import meshio 
points, cells, point_data, cell_data, field_data = meshio.read('file.vtk')