2013-02-12 4 views
4

У меня есть массив значений плотности в сферических координатах. Более конкретно, у меня есть массив с плотностью с формой (180 200 200). У меня также есть массив, называемый r_coord, theta_coord и phi_coord, также с формой (180,200,200), являющейся сферическими координатами для массива плотности.Как я могу интерполировать массив от сферических до декартовых координат с помощью Python?

Я хотел бы сопоставить эту плотность с декартовыми координатами с помощью python. Поэтому мне понадобится новая плотность 2, которая интерполируется по декартовым координатам x_coord, y_coord и z_coord. Я нашел scipy.ndimage.interpolation.map_coordinates, который выглядит многообещающим, но я не могу понять, как заставить его работать.

Любая помощь будет оценена по достоинству. Благодарю.

+2

См. Http://stackoverflow.com/questions/4116658/faster-numpy-cartesian-to-spherical-coordinate-conversion для возможных указателей на то, как это сделать. – hd1

+1

Интерполяция - это сложная часть, а не преобразование координат (о чем говорится в комментарии выше). imho, OP является правильным, чтобы предлагать подпрограммы интерполяции. – tom10

ответ

1

Что-то, как это должно работать:

import scipy.interpolate 
rflat=scipy.array(r_coord.flat) 
tflat=scipy.array(theta_coord.flat) 
pflat=scipy.array(phi_coord.flat) 
coordpoints=scipy.concatenate([ rflat[:, scipy.newaxis], tflat[:,scipy.newaxis], pflat[:,scipy.newaxis] ] , axis=1) 
rtpinterpolator=scipy.interpolate.linearNDInterpolate(coordppoints, density.flat)  

def xyz2rtp(x,y,z): 
    r=scipy.sqrt(x**2+y**2+z**2) 
    t=scipy.acos(z/r) 
    p=scipy.atan2(y, x) 
    return (r,t,p) 

# now you can get the interpolated value for any (x,y,z) coordinate you want. 
val=rtpinterpolator(xyz2rtp(x,y,z)) 

Ключевые моменты:

  • Использование существующих SciPy многомерная интерполяция,
  • преобразовать xyz координаты rtp когда вы передать его в интерполятор.
Смежные вопросы