Python 是否将vtkPoints转换为numpy数组?
我在Python脚本中使用Mayavi2计算3d iso曲面。因此,我得到一个vtkPoints对象。现在,我想将这个vtkPoints对象(“下面代码示例中的vtkout”)转换为一个简单的numpy数组,其中有3行包含所有x、y和z值。 我使用如下代码获取vtkout:Python 是否将vtkPoints转换为numpy数组?,python,numpy,vtk,Python,Numpy,Vtk,我在Python脚本中使用Mayavi2计算3d iso曲面。因此,我得到一个vtkPoints对象。现在,我想将这个vtkPoints对象(“下面代码示例中的vtkout”)转换为一个简单的numpy数组,其中有3行包含所有x、y和z值。 我使用如下代码获取vtkout: import numpy from enthought.mayavi import mlab import array randVol = numpy.random.rand(50,50,50) # fill
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]
我想知道是否没有常规程序可以方便、快速、安全地为我进行此类转换?从原始帖子的评论中可以确认,您可以尝试:
vtkout.to_array().T
这是一种不需要循环的直接方法。vtk\u points.to\u array()
对我不起作用(to\u array()在普通vtk中似乎不存在)
在我的案例中,实际起作用的是使用numpy\u支持
模块:
from vtk.util import numpy_support
as_numpy = numpy_support.vtk_to_numpy(vtk_points.GetData())
我不知道VTK的Python接口,但是如果你幸运的话,他们正确地使用了Python的缓冲区接口。尝试一些类似于
numpy.frombuffer(vtkout)
的方法,然后进行重塑。像Sven一样,我不熟悉这个界面,但通过谷歌搜索(如果我得到了正确的界面——我试图找到点数),您可能可以使用vtkout.to\u array()
。如果您提供一个简短的示例,其中包含正确的导入语句以生成示例vtkPoints对象,我可能会进一步帮助您。@JoshAdel:非常感谢,您当然是对的!我读了一些关于to_array()方法的内容,但不知何故没有正确地使用它。现在我又试了一次,效果非常好pointsArray=vtkout.to_array().T
执行此任务。如果你愿意,你可以加上这个作为答案,这样我就可以给你适当的学分;)@斯文:我也试过你的建议,但不幸的是,缓冲区接口没有实现。无论如何谢谢你!我尝试了同样的方法,但收到了一个错误:python中的“AttributeError:to_array”。你还记得你正在使用的vtk版本吗?或者你有什么想法,为什么这对我不起作用?也许和Mayavi2有关?您知道这是否适用于常规vtk python绑定吗?@JakobS。对不起,我现在才再次无意中发现这个问题。是的,我用括号写的,但我仍然看到了相同的错误:D最后我“手动”将点复制到numpy数组中(与您最初的建议类似)。我无法在我的vtkPoints
对象上使用此方法(AttributeError:to_array
)。有什么想法吗?这个答案不再有效了。请参阅Fabio Zadrozny对vtk8.x有效的答案