2013-04-01 9 views
6

Per coloro che desiderano esportare un semplice array 3D di numpy (insieme ad assi) in un file .vtk (o .vtr) per la post-elaborazione e la visualizzazione in Paraview o Mayavi c'è un piccolo modulo chiamato PyEVTK che fa esattamente questo. Il modulo supporta dati strutturati e non strutturati ecc. Sfortunatamente, anche se il codice funziona bene nei sistemi basati su Unix, non posso farlo funzionare (continua a bloccarsi) su qualsiasi installazione di Windows che rende semplicemente le cose complicate. Ive ha contattato lo sviluppatore, ma i suoi suggerimenti non ha funzionatoEsportazione di un 3D Numpy in un file VTK per la visualizzazione in Paraview/Mayavi

Quindi la mia domanda è: Come si può utilizzare la funzione from vtk.util import numpy_support di esportare una matrice 3D (la funzione stessa non supporta gli array 3D) in un file .vtk? C'è un modo semplice per farlo senza creare vtkDataset etc etc?

Grazie mille!

+0

Mayavi può visualizzare una matrice numpy 3d ed esportarla in un paio di formati 3d. Non sono sicuro di cosa stai cercando – theta

+0

Paraview non funziona con gli array di numpy e soprattutto se vuoi lanciare un array 3D rettilineo con i suoi assi. Tali dati devono essere convertiti in un formato come .vtr prima. Questa conversione è ciò che Im dopo. Qualche idea? Inoltre cosa intendevi per Mayavi che supporta gli array numpy? L'idea era di creare un file da una matrice numpy creata all'esterno di Mayavi e importarla in un software come un file – somada141

+0

ParaView funziona con numpy (leggi il manuale su "Python Programmable Filter") e Mayavi può leggere array numpy, ovviamente, e esportalo in vari formati 3d (che sono supportati da BTW da ParaView) – theta

risposta

6

È stato per sempre e avevo completamente dimenticato di fare questa domanda, ma alla fine ho capito. Ho scritto un post su questo nel mio blog (PyScience) fornendo un tutorial su come convertire tra NumPy e VTK. Non dare un'occhiata, se interessati:

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

+0

Mi piacerebbe parlarti di questo @ somada141, sto provandolo ora in Python 3.5 e sto trovando degli errori - stai ancora lavorando con queste metodologie? – kevinkayaks

+0

@kevinkayaks l'ultima volta che ho controllato il supporto a Python 3 per molte di quelle librerie era un po 'incerto, ma non esitare a contattarmi. Siccome SO non supporta nessun PM, mi mandi una mail a su Gmail se hai bisogno di aiuto con w sth. – somada141

2

Non è una risposta diretta alla tua domanda, ma se hai tvtk (se hai mayavi, dovresti averlo), puoi usarlo per scrivere i tuoi dati in formato vtk. (Vedi: http://code.enthought.com/projects/files/ETS3_API/enthought.tvtk.misc.html)

Non utilizza PyEVTK e supporta una vasta gamma di origini dati (più che solo griglie strutturate e non strutturate), quindi probabilmente funzionerà dove altre cose non lo sono.

Come un esempio veloce (l'interfaccia di Mayavi mlab può fare questo molto meno prolissa, soprattutto se si sta già usando.):

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') 

E una parte del file di output:

# 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

Grazie mille per la risposta Joe! Sembra che stia facendo quello che volevo più o meno.Ho solo bisogno di usare un formato per griglie non uniformi ma sono sicuro che lo spoglio :) – somada141

0

TVTK di Mayavi ha un bel modo di scrivere file VTK. Ecco un esempio di prova che ho scritto per me stesso seguendo la documentazione di @Joe e tvtk. Il vantaggio che ha su evtk, è il supporto sia per ascii che per html. Lo aiuterà ad aiutare le altre persone.

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

So che è un po 'tardi e mi piacciono i tuoi tutorial @ somada141. Questo dovrebbe funzionare anche

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 

Spero che sia d'aiuto!

+0

hey applaude Rick! Non ho ancora visto questo approccio prima. Quale versione VTK stavi usando per questo? – somada141

+0

hey @ somada141 Attualmente sto usando VTK 7. Il suo Sidh però;) –