Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否将vtkPoints转换为numpy数组?_Python_Numpy_Vtk - Fatal编程技术网

Python 是否将vtkPoints转换为numpy数组?

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

我在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 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有效的答案