2012-07-30 25 views
13

Mi è stato assegnato un file vtk di formato legacy (penso che sia una griglia non strutturata) e mi piacerebbe leggerlo con python e generare invece un file .npy, poiché so come affrontarlo.Lettura di un file .vtk con python

Il file è una discarica di ATHENA e quindi ha densità, velocità, campo magnetico e le coordinate.

Sono molto un programmatore di procedura, in modo che tutti questi oggetti sono confusa ...

+3

Potrebbe inviare un campione di dati di questo file? –

+0

C'è [PyEVTK] (https://bitbucket.org/pauloh/pyevtk) per la scrittura, ma non supporta la lettura – jterrace

+0

Oh, dal link di jterrace vedo che è un formato binario. Bleh. –

risposta

4

Hai provato a usare paraview? (http://www.paraview.org/) Può darti un'idea visiva di cosa sta succedendo dietro le quinte e può emettere il file in diversi modi. Suggerirei questo perché non ho idea di come siano i tuoi dati. http://www.vtk.org/Wiki/VTK/Examples/Python potrebbe anche avere un esempio che potrebbe adattarsi alla fattura. Personalmente, mi piacerebbe giocare con il paraview e andare da lì.

+1

Ho usato la paraview prima, o meglio un add-on chiamato VISIT. Tuttavia, ho bisogno di analizzare cosa c'è nel file e fare cose come fft ecc. E quindi semplicemente visualizzarlo non è abbastanza. –

4

Ecco uno script che legge i dati poligonali in array NumPy da un file VTK utilizzando il 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 
+0

Sono stato in grado di accedere alla fase GetOutput() utilizzando vtkDataSetReader() anziché vtkPolyDataReader, ma sono ancora confuso su come ottenere le informazioni. GetNumberOfPoints e GetNumberOfCells sembrano darmi numeri ragionevoli per quanto grande penso che gli array dovrebbero essere, ma non so ancora come estrarre tutte le variabili. C'è un modo per ottenere informazioni su cosa contiene esattamente il VTK e in quale forma? In un modo comprensibile? –

+0

Se si seleziona qui uno dei file http://people.sc.fsu.edu/~jburkardt/data/vtk/vtk.html, posso provare ad aiutare ad estrarre il formato. Ci sono così tanti formati diversi. – jterrace

+0

reader.IsFileStructuredPoints() restituisce 1, le altre opzioni restituiscono 0, quindi sto uscendo su un arto e sto dicendo che è un vtk legacy di Punti strutturati. –

13

Ecco la soluzione che mi è venuta, il trucco stava accendendo 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

Va ricordato che nella sua ultima release, il progetto yt http://yt-project.org/ include il supporto per ATHENA, il che significa che con tutti i mezzi questo è il modo di analizzare i dati di simulazione utilizzando python.

2

meshio (un progetto di miniera) conosce il formato VTK, così si potrebbe semplicemente

pip install meshio 

e poi

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