Получение изоповерхности из 3D данных и соответствующих индексов

У меня есть трехмерный массив значений температуры в сетке. Из этого я могу вычислить градиенты, используя . Теперь меня интересуют только значения градиентов на изоповерхности, где температура составляет 900. Я хочу сделать что-то вроде (псевдокодиса):

      import nympy as np
def regular(x,y,z,q=100,k=175,a=7.1e-5):
    R = np.sqrt(x**2+y**2+z**2)
    return 100 / (2*np.pi*k) * (1/R) * np.exp(-0.5/a*(R+x))
x = np.arange(-1.5,0.5+res/2,res)*1e-3
y = np.arange(-1.0,1.0+res/2,res)*1e-3
z = np.arange(0.0,0.5+res/2,res)*1e-3
Y,X,Z = np.meshgrid(y,x,z)
T = regular(X,Y,Z)
dTdx, dTdy, dYdz = np.gradient(T)

(xind,yind,zind) = <package>.get_contour_indices(X,Y,Z,T,value=900)
x_gradients_at_isosurface = dTdx[xind,yind,zind]
...

Я пытался:

      import numpy as np
from skimage import measure
contour_data = measure.find_contours(T[:,:,0],900)
contour_data = np.int_(np.round(contour_data[0]))
xs,ys = contour_data[:,0],contour_data[:,1]
gradients_of_interest = np.array([G[x,y,0] for x,y in zip( xs,ys )])

который отлично работает, но работает только для 2D-данных. Ищу 3D-эквивалент. Я нашел следующее:

      import plotly.graph_objects as go
surf = go.Isosurface(x=X.flatten(),y=Y.flatten(),z=Z.flatten(),value=T.flatten(),isomin=900,isomax=900)
fig = go.Figure(data=surf)
plt.show()

Но мне не интересно это строить. Я хочу знать индексы, где температура составляет T = 900, чтобы я мог использовать их для градиентов. Любые идеи?

1 ответ

Тебе нужно skimage.measure.marching_cubes.

Другие вопросы по тегам