2012-07-30 153 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')