2012-07-30 41 views
13

Tôi đã được cung cấp một tệp vtk định dạng cũ (tôi nghĩ rằng nó là một lưới không có cấu trúc) và tôi muốn đọc nó bằng python và xuất ra tệp .npy thay vì tôi biết làm thế nào để đối phó với điều đó.Đọc một tập tin .vtk với python

Tệp là một bãi chứa từ ATHENA và do đó có mật độ, vận tốc, từ trường cùng với các tọa độ.

Tôi là một lập trình viên thủ tục, vì vậy tất cả các đối tượng này đều khó hiểu ...

+3

thể bạn gửi một mẫu dữ liệu của tập tin này? –

+0

Có [PyEVTK] (https://bitbucket.org/pauloh/pyevtk) để viết, nhưng nó không hỗ trợ đọc – jterrace

+0

Ồ, từ liên kết của jterrace tôi thấy rằng đó là một định dạng nhị phân. Bleh. –

Trả lời

4

Bạn đã thử sử dụng paraview chưa? (http://www.paraview.org/) Nó có thể cung cấp cho bạn một ý tưởng trực quan về những gì đang xảy ra đằng sau hậu trường và có thể xuất tệp theo một số cách khác nhau. Tôi sẽ đề nghị này như tôi không có một đầu mối những gì dữ liệu của bạn là như thế. http://www.vtk.org/Wiki/VTK/Examples/Python cũng có thể có một ví dụ có thể phù hợp với hóa đơn cho bạn. Cá nhân, tôi có một vở kịch với paraview và đi từ đó.

+1

Tôi đã sử dụng paraview trước đây, hoặc thay vào đó là thêm vào nó gọi là VISIT. Tuy nhiên, tôi cần phải phân tích những gì trong tập tin và làm những việc như fft vv và vì vậy chỉ cần hình dung nó là không đủ. –

4

Dưới đây là một kịch bản mà đọc dữ liệu đa giác thành các mảng NumPy từ một tập tin VTK sử dụng 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

Tôi đã có thể vào giai đoạn GetOutput() bằng cách sử dụng vtkDataSetReader() thay vì vtkPolyDataReader, nhưng tôi vẫn còn bối rối về cách lấy thông tin. GetNumberOfPoints và GetNumberOfCells dường như cho tôi những con số hợp lý về mức độ lớn của mảng, nhưng tôi vẫn không biết cách rút tất cả các biến. Có cách nào để nhận thông tin về vtk chính xác trong đó và dưới dạng nào không? Một cách dễ hiểu? –

+0

Nếu bạn chọn một trong các tệp ở đây http://people.sc.fsu.edu/~jburkardt/data/vtk/vtk.html Tôi có thể thử và giúp trích xuất định dạng. Có rất nhiều định dạng khác nhau. – jterrace

+0

reader.IsFileStructuredPoints() trả về 1, các tùy chọn khác trả về 0, vì vậy tôi sẽ đi ra ngoài một chi và nói rằng nó là một vtk kế thừa của các điểm có cấu trúc. –

13

Dưới đây là giải pháp mà tôi đã đưa ra, lừa được bật 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

Nó nên được đề cập rằng trong phiên bản mới nhất của nó, là dự án yt http://yt-project.org/ bao gồm hỗ trợ cho ATHENA, có nghĩa là bằng mọi cách này là cách để phân tích các dữ liệu mô phỏng sử dụng python.

2

meshio (một dự án của tôi) biết định dạng VTK, vì vậy bạn có thể chỉ đơn giản là

pip install meshio 

và sau đó

import meshio 
points, cells, point_data, cell_data, field_data = meshio.read('file.vtk') 
Các vấn đề liên quan