2011-03-31 164 views
3

我在Python腳本中使用Mayavi2來計算3d等值面。結果我得到一個vtkPoints對象。現在我想將這個vtkPoints對象(下面代碼示例中的'vtkout')轉換爲一個簡單的numpy數組,其中包含所有x,y和z值的3行。 我得到vtkout使用這樣的代碼:將vtkPoints轉換爲numpy數組?

import numpy 
from enthought.mayavi import mlab 
import array 

randVol = numpy.random.rand(50,50,50)  # fill volume with some random potential 
X, Y, Z = numpy.mgrid[0:50, 0:50, 0:50]  # grid 
surf = mlab.contour3d(X, Y, Z, randVol, contours=[0.5]) # calc contour 
vtkout = surf.contour.contour_filter.output.points  # get the vtkPoints object 

在我使用下面的代碼點提取到一個數組的那一刻:

pointsArray = numpy.zeros((3, vtkout.number_of_points)) 
for n in range(vtkout.number_of_points): 
    pointsArray[0,n] = vtkout[n][0] 
    pointsArray[1,n] = vtkout[n][1] 
    pointsArray[2,n] = vtkout[n][2] 

不知有沒有一般常規做這樣的以方便,快捷和安全的方式爲我轉換?

+0

我不知道VTK的Python接口,但如果你是幸運的,他們正確使用Python的緩衝接口。嘗試類似'numpy.frombuffer(vtkout)'並在此之後重新塑形。 – 2011-03-31 12:55:51

+1

像Sven一樣,我對界面並不熟悉,但是有一點Google搜索表明(如果我有正確的界面 - 我試圖找到number_of_points),那麼你可以使用'vtkout.to_array()'。如果你提供了一個簡短的例子,用正確的導入語句來生成一個樣本vtkPoints對象,我可能會幫助你進一步。 – JoshAdel 2011-03-31 13:07:06

+0

@JoshAdel:非常感謝,當然你是對的!我讀了一些關於'to_array()'方法的內容,但不知何故沒有正確使用它。現在我再次嘗試它,它完美的工作! 'pointsArray = vtkout.to_array()。T'完成這項工作。如果你想要你可以添加這個答案,以便我可以給你適當的學分;)。 @Sven:我也試過你的建議,但不幸的是,緩衝區接口沒有實現。不管怎麼說,多謝拉! – 2011-04-01 07:36:45

回答

3

由於從原崗位評論證實,你可以嘗試:

vtkout.to_array().T 

這是一個不需要循環的直接方法。

+0

我無法在我的'vtkPoints'對象('AttributeError:to_array')上使用此方法。有任何想法嗎? – Jack 2016-03-16 20:45:01

0

vtk_points.to_array()沒有爲我工作(to_array()似乎並不存在於普通的VTK)。

什麼在我的案件的實際工作是使用numpy_support模塊:

from vtk.util import numpy_support 
as_numpy = numpy_support.vtk_to_numpy(vtk_points.GetData())