将vtkPoints转换为numpy数组?

3

我在Python脚本中使用Mayavi2计算3D等值面。结果,我得到了一个vtkPoints对象。现在,我想将这个vtkPoints对象(下面代码示例中的'vtkout')转换为一个简单的numpy数组,其中包含所有x,y和z值的3行。

我使用以下代码获取vtkout:

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)这样的方法,然后进行重塑。 - Sven Marnach
1
就像Sven所说,我不熟悉这个接口,但是通过一些搜索(如果我找到了正确的接口——我尝试查找number_of_points),你可能可以使用vtkout.to_array()。如果您提供一个简短的例子和适当的导入语句来生成一个样本vtkPoints对象,我可以为您提供更进一步的帮助。 - JoshAdel
1
我尝试了同样的方法,但是在 Python 中收到一个错误:“AttributeError: to_array”。你还记得当时使用的 vtk 版本吗?或者你知道为什么我不能使用这个方法吗?也许这与 Mayavi2 有关?你知道这个方法是否适用于常规的 vtk Python 绑定吗? - Chris
1
@JakobS. 抱歉,我刚才又偶然发现了这个问题。是的,我用括号写了它,但最终我仍然看到相同的错误:D 最后我“手动”将点复制到numpy数组中(类似于您的最初建议)。 - Chris
@Chris 我也有同样的问题 - 这非常令人沮丧。你使用的是哪个版本的Paraview? - Dipole
显示剩余2条评论
2个回答

8

vtk_points.to_array() 对我来说不起作用(在纯vtk中似乎不存在to_array()函数)。

实际上在我的情况下可行的方法是使用numpy_support模块:

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

3

根据原帖的评论,你可以尝试以下方法:

vtkout.to_array().T

这是一种不需要循环的直接方法。

我无法在我的 vtkPoints 对象上使用这个方法 (AttributeError: to_array)。有任何想法吗? - Dipole
这个答案已经不再有效。请查看Fabio Zadrozny的答案,该答案适用于vtk8.x。 - normanius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接