2011-08-01 6 views
6

필자는 스칼라 값의 largeish 3D numpy 배열을 가지고 있습니다 (꼭 필요한 경우 "볼륨"이라고 부름). 나는 불규칙한 연속으로 이것에 대해 부드러운 스칼라 필드를 보간하고 싶습니다. 모두 의 비 - 통합 xyz 좌표로 알려진 것은 아닙니다.scipy 보간법의 그래디언트를 직접 얻는 방법은 무엇입니까?

이것

지금 Scipy 지원 단지 우수 : 제가

filtered_volume = scipy.ndimage.interpolation.spline_filter(volume) 

와 부피를 필터링하고 외관상 좋게 행동 얻었다 관심 (X, Y, Z)에 대해

scipy.ndimage.interpolation.map_coordinates(
    filtered_volume, 
    [[z],[y],[x]], 
    prefilter=False) 

호출 (매끄러운 등) 보간 값.

지금까지 그렇게 좋았습니다. 그러나 내 응용 프로그램에는 보간 된 필드의 로컬 파생물도 필요합니다. 현재 나는 중앙 차분 (central-differencing)에 의해 이것들을 얻습니다 : 나는 또한 6 개의 추가 지점에서 볼륨을 샘플링합니다 (적어도 map_coordinates에 대한 한 번의 호출로 이루어질 수 있습니다). 그리고 (i(x+h,y,z)-i(x-h,y,z))/(2*h)에서 x 도함수를 계산하십시오. (예, 추가 탭 수를 3 개로 줄이고 "일방적 인"차이점을 줄 수 있지만, 비대칭 성이 나를 괴롭히는 것을 알 수 있습니다.)

필자의 본능은 그래디언트를 직접 얻는 방법이 있어야한다는 것입니다 하지만 스플라인 수학 (아직)을 이해하기에 충분하지 않거나 이 Scipy 구현의 용기에서 진행되는 것을 이해하지 못합니다 : scipy/scipy/ndimage/src/ni_interpolation.c.

중앙 차분보다 "더 직접적으로"기울기를 얻는 더 좋은 방법이 있습니까? 가급적이면 Scipy의 내장을 해킹하기보다는 기존 기능을 사용하여 얻을 수있는 것이 좋습니다.

+1

환상적인 질문입니다! 필자는'filtered_volume'의 스플라인 계수에서 그라디언트를 얻는 것이 상당히 간단 할 것이라고 생각합니다. 그러나 저는 여러분이하는 것보다 정확히하는 방법에 대해 더 이상 생각하지 않습니다. 또한 scipy 메일 링리스트에서. –

답변

1

아하 다음 NumPy와 코드에 인용 된 classic paper on splines에 따라 순서의 스플라인 N 및 이들의 유도체 내가 또한 낮은 유지하여 내 파생 상품을 얻을 수 SciPy의 스플라인 보간을 사용 그래서

n   n-1   n-1 
dB (x)/dx = B (x+1/2) - B (x-1/2) 

으로 관련되어 사전 필터링 된 볼륨을 분석하고 파생 당 두 번 쿼리합니다. 이것은 상당한 양의 메모리를 추가하는 것을 의미합니다 (아마도 캐시의 "메인"볼륨과의 경쟁). 아마도 더 낮은 차수 스플라인의 평가가 더 빠를 것입니다. 따라서 중앙 차분보다 속도가 더 빠르거나 빠를 지 확실하지 않습니다. 작은 오프셋을 사용하여 현재하고 있습니다. 아직 시도하지 않았습니다.