如何将vtkPoints转换为numpy数组?

3 投票
2 回答
5219 浏览
提问于 2025-04-16 14:47

我在一个Python脚本中使用Mayavi2来计算三维等值面。结果我得到了一个vtkPoints对象。现在我想把这个vtkPoints对象(在下面的代码示例中叫做'vtkout')转换成一个简单的numpy数组,这个数组有三行,分别包含所有的x、y和z值。

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]

我在想,是否没有一个通用的方法可以方便、快速、安全地帮我完成这样的转换呢?

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

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

撰写回答