필자는 스칼라 값의 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의 내장을 해킹하기보다는 기존 기능을 사용하여 얻을 수있는 것이 좋습니다.
환상적인 질문입니다! 필자는'filtered_volume'의 스플라인 계수에서 그라디언트를 얻는 것이 상당히 간단 할 것이라고 생각합니다. 그러나 저는 여러분이하는 것보다 정확히하는 방법에 대해 더 이상 생각하지 않습니다. 또한 scipy 메일 링리스트에서. –