Извлечение данных из трубопровода Mayavi - в частности, координаты для определенной поверхности - PullRequest
0 голосов
/ 01 ноября 2018

Я запускаю скрипт для создания цилиндрической поверхности, определяемой набором точек. Я использую Mayavi для визуализации. Для следующего скрипта, как я могу найти координаты каждой точки? Кажется, что Mayavi делает это за кулисами в конвейере данных, но я не слишком уверен, как его извлечь. В качестве альтернативы я попытался выполнить вложенные циклы, но я не определился с правильным алгоритмом ... Тем временем я продолжу попытки. Однако, если кто-то знает, как извлечь их из конвейера 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()

1 Ответ

0 голосов
/ 01 ноября 2018

Все данные, которые вы передаете в 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 все входные массивы потерял всю возможную многомерную структуру, и я почти уверен, что именно так и происходит.

...