2012-07-30 28 views
13

Me han proporcionado un archivo vtk de formato heredado (creo que es una cuadrícula no estructurada) y me gustaría leerlo con python y generar un archivo .npy en su lugar, ya que sé como lidiar con esoLectura de un archivo .vtk con python

El archivo es un volcado de ATHENA y también tiene densidad, velocidad, campo magnético junto con las coordenadas.

estoy en gran medida un programador de procedimiento, por lo que todos estos objetos son confusas ...

+3

¿podría enviar una muestra de los datos de este archivo? –

+0

Hay [PyEVTK] (https://bitbucket.org/pauloh/pyevtk) para escribir, pero no es compatible con la lectura – jterrace

+0

Oh, desde el enlace de jterrace veo que es un formato binario. Bleh. –

Respuesta

4

¿Ha intentado utilizar paraview? (http://www.paraview.org/) Puede darle una idea visual de lo que está sucediendo detrás de escena y puede generar el archivo de varias maneras diferentes. Sugeriría esto ya que no tengo ni idea de cómo son tus datos. http://www.vtk.org/Wiki/VTK/Examples/Python también puede tener un ejemplo que pueda ajustarse a la factura por usted. Personalmente, tengo una obra de teatro con paraview e inicio desde allí.

+1

He usado paraview antes, o más bien un complemento llamado VISIT. Sin embargo, necesito analizar qué hay en el archivo y hacer cosas como fft, etc., y simplemente visualizarlo no es suficiente. –

4

Aquí hay un script que lee datos de polígonos en matrices numpy de un archivo VTK utilizando el SDK Python VTK:

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

Pude llegar a la etapa GetOutput() usando vtkDataSetReader() en lugar de vtkPolyDataReader, pero todavía estoy confundido acerca de cómo obtener la información. GetNumberOfPoints y GetNumberOfCells parece darme números razonables de cuán grande creo que deberían ser las matrices, pero todavía no sé cómo extraer todas las variables. ¿Hay alguna forma de obtener información sobre qué tiene exactamente vtk y de qué forma? De una manera entendible? –

+0

Si elige uno de los archivos aquí http://people.sc.fsu.edu/~jburkardt/data/vtk/vtk.html, puedo intentar y ayudar a extraer el formato. Hay tantos formatos diferentes. – jterrace

+0

reader.IsFileStructuredPoints() devuelve 1, las otras opciones devuelven 0, por lo que voy a salir en una extremidad y decir que es una vtk heredada de Puntos estructurados. –

13

Aquí está la solución que se me ocurrió, el truco estaba convirtiendo en 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

Cabe mencionar que, en su última versión, el proyecto yt http://yt-project.org/ incluye soporte para ATHENA, lo que significa que de todos modos se trata de manera de analizar los datos de simulación utilizando pitón.

2

meshio (un proyecto mío) conoce el formato VTK, por lo que podría ser simplemente

pip install meshio 

y luego

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