2013-04-01 9 views
6

'da görüntülemek için bir VTK dosyasına dışa aktarma Basit bir 3B numpy dizisini (eksenlerle birlikte) sonradan işleme ve görüntüleme için bir .vtk (veya .vtr) dosyasına vermek isteyenler için Paraview veya Mayavi'de tam olarak bunu yapan PyEVTK adlı küçük bir modül var. Modül yapılandırılmış ve yapılandırılmamış verileri destekler vb .. Ne yazık ki, kod unix tabanlı sistemlerde gayet iyi çalışıyor olsa da, herhangi bir pencere kurulumunda çalışmayı başaramadım (çökmeyi engelliyor). Ive geliştirici temas ama onun önerileri benim sorum nedenleParaview/Mayavi

işe yaramadı: İnsan nasıl bir .vtk dosyaya bir 3D dizisi (fonksiyon kendisi 3D diziler desteklemez) ihracat from vtk.util import numpy_support işlevini kullanabilirsiniz? VtkDatasets vs vs oluşturmadan bunu yapmak için basit bir yolu var mı?

Çok teşekkürler!

+0

Mayavi, 3B numpy dizisini görüntüleyebilir ve birkaç 3d formatına aktarabilir. – theta

+0

'dan sonra Paraview'ın numpy dizileriyle çalışmadığından ve özellikle de eksenleri ile doğrusal bir 3B dizi atmak istediğinizden emin değilim. Bu tür verilerin öncelikle .vtr gibi bir biçime dönüştürücü olması gerekir. Bu dönüşüm sonra ne olduğumu. Herhangi bir fikir? Ayrıca Mayavi hakkında numpy dizileri destekleyen hakkında ne demek istediniz? Fikir Mayavi dışında oluşturulan bir numpy dizisinden bir dosya oluşturmak ve bir dosya – somada141

+0

ParaView gibi bir yazılım olarak içe aktarmak için numpy ile çalışmaktadır ("Python Programlanabilir Filtre" hakkında kılavuzu okuyun) ve Mayavi numpy dizisini okuyabilir ve Çeşitli 3 boyutlu formatlara (ParaView tarafından desteklenen BTW) ihraç et – theta

cevap

6

Sonsuza kadar sürdü ve bu soruyu sormayı tamamen unutmuştum ama bunu çözmeyi bitirdim. NumPy ve VTK arasında nasıl dönüştürüleceğine dair bir eğitim sunan blogumda (PyScience) bir yazı yazdım. Mayavi ait

pyscience.wordpress.com/2014/09/06/numpy-to-vtk-converting-your-numpy-arrays-to-vtk-arrays-and-files/

+0

Bu @ somada141 hakkında konuşmak istiyorum, bunu python 3.5'de deniyorum ve hata buluyorum - Hala bu metodolojilerle mi çalışıyorsunuz? – kevinkayaks

+0

@kevinkayaks son Python 3'ü kontrol ettim, bu kütüphanelerin çoğunun desteği biraz iftihardı, ancak ulaşmaktan çekiniyordu. SO desteklemediği için, yardıma ihtiyacınız varsa, Gmail'de numaralı telefondan bana posta gönderin. – somada141

2

Sorunuza doğrudan bir yanıt değil, ancak tvtk (mayavi varsa, sahip olmanız gerekiyor) varsa, verilerinizi vtk biçimine yazmak için kullanabilirsiniz. (Bkz .: http://code.enthought.com/projects/files/ETS3_API/enthought.tvtk.misc.html)

PyEVTK'u kullanmaz ve çok çeşitli veri kaynaklarını destekler (yalnızca yapılandırılmış ve yapılandırılmamış ızgaralardan daha fazlası), bu nedenle muhtemelen başka şeylerin olmadığı yerlerde çalışır.

hızlı bir örnek olarak

(daha önce kullandığınız özellikle Mayavi en mlab arayüzü, bu çok daha az ayrıntılı yapabilirsiniz.):

import numpy as np 
from enthought.tvtk.api import tvtk, write_data 

data = np.random.random((10,10,10)) 

grid = tvtk.ImageData(spacing=(10, 5, -10), origin=(100, 350, 200), 
         dimensions=data.shape) 
grid.point_data.scalars = np.ravel(order='F') 
grid.point_data.scalars.name = 'Test Data' 

# Writes legacy ".vtk" format if filename ends with "vtk", otherwise 
# this will write data using the newer xml-based format. 
write_data(grid, 'test.vtk') 

Ve çıkış dosyasının bir bölümünü:

# vtk DataFile Version 3.0 
vtk output 
ASCII 
DATASET STRUCTURED_POINTS 
DIMENSIONS 10 10 10 
SPACING 10 5 -10 
ORIGIN 100 350 200 
POINT_DATA 1000 
SCALARS Test%20Data double 
LOOKUP_TABLE default 
0.598189 0.228948 0.346975 0.948916 0.0109774 0.30281 0.643976 0.17398 0.374673 
0.295613 0.664072 0.307974 0.802966 0.836823 0.827732 0.895217 0.104437 0.292796 
0.604939 0.96141 0.0837524 0.498616 0.608173 0.446545 0.364019 0.222914 0.514992 
... 
... 
+0

Yanıt Joe için çok teşekkürler! Bu az çok istediğim şeyi yapıyor gibi görünüyor.Tekdüze olmayan ızgaralar için bir format kullanmam gerekiyor ama eminim ki bunu çekeceğim :) – somada141

0

TVTK vtk dosyaları yazma güzel yolu vardır: eğer ilgilenen bir göz atın etmeyin. İşte @Joe ve tvtk belgelerini takip ettikten sonra kendim için yazdığım bir test örneği. Evtk üzerinde sahip olduğu avantaj, ascii ve html.Hope için diğer insanlara yardımcı olacaktır.

from tvtk.api import tvtk, write_data 
import numpy as np 

#data = np.random.random((3, 3, 3)) 
# 
#i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) 
#i.point_data.scalars = data.ravel() 
#i.point_data.scalars.name = 'scalars' 
#i.dimensions = data.shape 
# 
#w = tvtk.XMLImageDataWriter(input=i, file_name='spoints3d.vti') 
#w.write() 

points = np.array([[0,0,0], [1,0,0], [1,1,0], [0,1,0]], 'f') 
(n1, n2) = points.shape 
poly_edge = np.array([[0,1,2,3]]) 

print n1, n2 
## Scalar Data 
#temperature = np.array([10., 20., 30., 40.]) 
#pressure = np.random.rand(n1) 
# 
## Vector Data 
#velocity = np.random.rand(n1,n2) 
#force  = np.random.rand(n1,n2) 
# 
##Tensor Data with 
comp = 5 
stress = np.random.rand(n1,comp) 
# 
#print stress.shape 
## The TVTK dataset. 
mesh = tvtk.PolyData(points=points, polys=poly_edge) 
# 
## Data 0 # scalar data 
#mesh.point_data.scalars = temperature 
#mesh.point_data.scalars.name = 'Temperature' 
# 
## Data 1 # additional scalar data 
#mesh.point_data.add_array(pressure) 
#mesh.point_data.get_array(1).name = 'Pressure' 
#mesh.update() 
# 
## Data 2 # Vector data 
#mesh.point_data.vectors = velocity 
#mesh.point_data.vectors.name = 'Velocity' 
#mesh.update() 
# 
## Data 3 additional vector data 
#mesh.point_data.add_array(force) 
#mesh.point_data.get_array(3).name = 'Force' 
#mesh.update() 

mesh.point_data.tensors = stress 
mesh.point_data.tensors.name = 'Stress' 

# Data 4 additional tensor Data 
#mesh.point_data.add_array(stress) 
#mesh.point_data.get_array(4).name = 'Stress' 
#mesh.update() 

write_data(mesh, 'polydata.vtk') 

# XML format 
# Method 1 
#write_data(mesh, 'polydata') 

# Method 2 
#w = tvtk.XMLPolyDataWriter(input=mesh, file_name='polydata.vtk') 
#w.write() 
1

Biraz geç olduğunu biliyorum ve öğreticilerinizi seviyorum @ somada141. Bu da işe yaramalı.

def numpy2VTK(img, spacing=[1.0, 1.0, 1.0]): 
# evolved from code from Stou S., 
# on http://www.siafoo.net/snippet/314 
# This function, as the name suggests, converts numpy array to VTK 
importer = vtk.vtkImageImport() 

img_data = img.astype('uint8') 
img_string = img_data.tostring() # type short 
dim = img.shape 

importer.CopyImportVoidPointer(img_string, len(img_string)) 
importer.SetDataScalarType(VTK_UNSIGNED_CHAR) 
importer.SetNumberOfScalarComponents(1) 

extent = importer.GetDataExtent() 
importer.SetDataExtent(extent[0], extent[0] + dim[2] - 1, 
         extent[2], extent[2] + dim[1] - 1, 
         extent[4], extent[4] + dim[0] - 1) 
importer.SetWholeExtent(extent[0], extent[0] + dim[2] - 1, 
         extent[2], extent[2] + dim[1] - 1, 
         extent[4], extent[4] + dim[0] - 1) 

importer.SetDataSpacing(spacing[0], spacing[1], spacing[2]) 
importer.SetDataOrigin(0, 0, 0) 


return importer 

Umut eder!

+0

hey heybetli Rick! Bu yaklaşımı daha önce hiç görmedim. Bunun için hangi VTK sürümünü kullanıyordunuz? – somada141

+0

hey @ somada141 Şu anda VTK 7 kullanıyorum. Onun Sidh olsa;) –