从 Mayavi 管道中提取数据——特别是点定义面的坐标
Extracting data from Mayavi pipeline -- specifically coordinates for a point-defined-surface
我是 运行 一个脚本,用于创建由一组点定义的圆柱面。我正在使用 Mayavi 来渲染可视化效果。对于以下脚本,如何找到每个点的坐标?似乎 Mayavi 在数据管道的幕后执行此操作,但我不太确定如何提取它。或者,我尝试做嵌套的 for 循环,但我还没有找到正确的算法……在此期间我会继续尝试。但是,如果有人知道如何从 Mayavi 管道中提取它们,那就太好了,因为我不必再增加任何计算时间。
import numpy as np
import mayavi
from mayavi import mlab
class cylinder:
def __init__(self, radius, length):
phi, x = np.mgrid[0:np.pi:50j, 0:length:50j]
self.z = radius * np.sin(phi)
self.y = radius * np.cos(phi)
self.x = x
self.mesh = mlab.points3d(self.x,self.y,self.z, mode = 'point')
def main():
cylinder = cylinder(radius=1,length=2)
mayavi.mlab.axes()
mlab.show()
main()
你传递给mayavi的所有数据都会出现在相应的数据源中。但是,我要指出的是,我认为您不会经常想要对管道中的数据进行逆向工程,因为首先是您传递了这些数据(因此您应该能够跟踪无需深入研究低级 vtk 机制)。
无论如何,假设您的管道中只有一个场景和一个数据源:
engine = mlab.get_engine()
source = engine.scenes[0].children[0]
# choose a scene among engine.scenes if necessary
# choose a source among engine.scenes[0] if necessary
points_data = np.array(source.data.points)
在您的具体示例中,您将三个形状为 (50,50)
的数组传递给 points3d
。我们得到的 points_data
是一个形状为 (2500,3)
的数组。可疑的。果然,我们可以将其reshape成合适的形状,以便重构原始数据:
x,y,z = points_data.T
# x,y,z have shape (2500,) now, no way to know the "true" original shape
# if we know what their shape _should_ be, we can fix that too:
x,y,z = points.data.reshape(50,50,3).transpose(2,0,1)
# compare to the original data
radius,length = 1,2
phi, x0 = np.mgrid[0:np.pi:50j, 0:length:50j]
z0 = radius * np.sin(phi)
y0 = radius * np.cos(phi)
print(np.array_equal(x, x0)) # True
print(np.array_equal(y, y0)) # True
print(np.array_equal(z, z0)) # True
由于输入数组的多维结构与 mayavi 无关,我不指望我们可以用正确的 shape 从管道。如果我是 mayavi,我会 ravel
所有输入数组丢失所有可能的多维结构,我很确定这正是发生的事情。
我是 运行 一个脚本,用于创建由一组点定义的圆柱面。我正在使用 Mayavi 来渲染可视化效果。对于以下脚本,如何找到每个点的坐标?似乎 Mayavi 在数据管道的幕后执行此操作,但我不太确定如何提取它。或者,我尝试做嵌套的 for 循环,但我还没有找到正确的算法……在此期间我会继续尝试。但是,如果有人知道如何从 Mayavi 管道中提取它们,那就太好了,因为我不必再增加任何计算时间。
import numpy as np
import mayavi
from mayavi import mlab
class cylinder:
def __init__(self, radius, length):
phi, x = np.mgrid[0:np.pi:50j, 0:length:50j]
self.z = radius * np.sin(phi)
self.y = radius * np.cos(phi)
self.x = x
self.mesh = mlab.points3d(self.x,self.y,self.z, mode = 'point')
def main():
cylinder = cylinder(radius=1,length=2)
mayavi.mlab.axes()
mlab.show()
main()
你传递给mayavi的所有数据都会出现在相应的数据源中。但是,我要指出的是,我认为您不会经常想要对管道中的数据进行逆向工程,因为首先是您传递了这些数据(因此您应该能够跟踪无需深入研究低级 vtk 机制)。
无论如何,假设您的管道中只有一个场景和一个数据源:
engine = mlab.get_engine()
source = engine.scenes[0].children[0]
# choose a scene among engine.scenes if necessary
# choose a source among engine.scenes[0] if necessary
points_data = np.array(source.data.points)
在您的具体示例中,您将三个形状为 (50,50)
的数组传递给 points3d
。我们得到的 points_data
是一个形状为 (2500,3)
的数组。可疑的。果然,我们可以将其reshape成合适的形状,以便重构原始数据:
x,y,z = points_data.T
# x,y,z have shape (2500,) now, no way to know the "true" original shape
# if we know what their shape _should_ be, we can fix that too:
x,y,z = points.data.reshape(50,50,3).transpose(2,0,1)
# compare to the original data
radius,length = 1,2
phi, x0 = np.mgrid[0:np.pi:50j, 0:length:50j]
z0 = radius * np.sin(phi)
y0 = radius * np.cos(phi)
print(np.array_equal(x, x0)) # True
print(np.array_equal(y, y0)) # True
print(np.array_equal(z, z0)) # True
由于输入数组的多维结构与 mayavi 无关,我不指望我们可以用正确的 shape 从管道。如果我是 mayavi,我会 ravel
所有输入数组丢失所有可能的多维结构,我很确定这正是发生的事情。