web-dev-qa-db-ja.com

python)で.vtkファイルを読み取る

レガシー形式のvtkファイル(非構造格子だと思います)が与えられましたが、それをpythonで読み込んで、代わりに.npyファイルを出力したいと思います。方法を知っているからです。それに対処するために。

このファイルはATHENAからのダンプであるため、座標とともに密度、速度、磁場が含まれています。

私は非常に手続き型プログラマーなので、これらすべてのオブジェクトは混乱しています...

15
Ben Jackel

これが私が思いついた解決策です。トリックは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')
18
Ben Jackel

meshio (私のプロジェクト)はVTK形式を知っているので、簡単にできます

pip install meshio

その後

import meshio
mesh = meshio.read('file.vtk')
# mesh.points, mesh.cells, ...
7
Nico Schlömer

これは、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
6
jterrace

最新のリリースでは、ytプロジェクト http://yt-project.org/ にATHENAのサポートが含まれていることに注意してください。つまり、これはPythonを使用してシミュレーションデータを分析する方法です。 。

4
Tim

Paraviewを使用してみましたか? (http://www.paraview.org/)これにより、舞台裏で何が起こっているかを視覚的に把握でき、さまざまな方法でファイルを出力できます。私はあなたのデータがどのようなものか見当がつかないので、これを提案します。 http://www.vtk.org/Wiki/VTK/Examples/Python また、あなたに合った例があるかもしれません。個人的には、paraviewで遊んで、そこから行きます。

4
g.stevo

レガシー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は点の数です。

1
ToddP