我在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]
不知有沒有一般常規做這樣的以方便,快捷和安全的方式爲我轉換?
我不知道VTK的Python接口,但如果你是幸運的,他們正確使用Python的緩衝接口。嘗試類似'numpy.frombuffer(vtkout)'並在此之後重新塑形。 – 2011-03-31 12:55:51
像Sven一樣,我對界面並不熟悉,但是有一點Google搜索表明(如果我有正確的界面 - 我試圖找到number_of_points),那麼你可以使用'vtkout.to_array()'。如果你提供了一個簡短的例子,用正確的導入語句來生成一個樣本vtkPoints對象,我可能會幫助你進一步。 – JoshAdel 2011-03-31 13:07:06
@JoshAdel:非常感謝,當然你是對的!我讀了一些關於'to_array()'方法的內容,但不知何故沒有正確使用它。現在我再次嘗試它,它完美的工作! 'pointsArray = vtkout.to_array()。T'完成這項工作。如果你想要你可以添加這個答案,以便我可以給你適當的學分;)。 @Sven:我也試過你的建議,但不幸的是,緩衝區接口沒有實現。不管怎麼說,多謝拉! – 2011-04-01 07:36:45