我有一个较大的 3D numpy 标量值数组(如果必须,可以将其称为“体积”)。我想在一系列不规则的、并非所有已知的预先非整数 xyz 坐标上插入一个平滑的标量场。
现在 Scipy 对此的支持非常好:我用
filtered_volume = scipy.ndimage.interpolation.spline_filter(volume)
并调用
scipy.ndimage.interpolation.map_coordinates(
filtered_volume,
[[z],[y],[x]],
prefilter=False)
对于感兴趣的 (x,y,z) 以获得明显表现良好(平滑等)的插值。
到现在为止还挺好。但是,我的应用程序还需要插值字段的局部导数。目前我通过中心差分获得这些:我还在 6 个额外的点处对体积进行采样(这至少可以通过一次调用来完成map_coordinates
)并计算例如 x 的导数(i(x+h,y,z)-i(x-h,y,z))/(2*h)
。(是的,我知道我可以将额外抽头的数量减少到 3 个并进行“单边”差异,但不对称会让我烦恼。)
我的直觉是应该有一种更直接的方式来获得梯度,但我不知道足够的样条数学(还)来弄清楚它,或者理解 Scipy 实现的核心发生了什么:scipy/scipy/ndimage/src/ni_interpolation.c
.
有没有比中心差分“更直接”获得我的梯度更好的方法?最好是允许使用现有功能而不是破解 Scipy 的内部功能来获得它们。