Все данные, которые вы передаете в 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)
. Подозрительно. Конечно, мы можем преобразовать его в соответствующую форму, чтобы восстановить исходные данные:
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, я не ожидаю, что мы сможем восстановить исходные x,y,z
массивы с правильной формой из конвейера. Если бы я был Mayavi, я бы ravel
все входные массивы потерял всю возможную многомерную структуру, и я почти уверен, что именно так и происходит.