Python 不均匀采样角度值的二维插值/平滑

Python 不均匀采样角度值的二维插值/平滑,python,math,numpy,scipy,interpolation,Python,Math,Numpy,Scipy,Interpolation,我有一些由不均匀采样的2D空间位置组成的数据,其中每个x,y坐标都有一个相关的相位值θ,在0和2pi之间。我希望能够将θ值插值到常规的x,y网格上。数据退化的意义在于,相同(或非常接近)的x、y位置可能与多个相位值相关,反之亦然,θ值,因此严格来说,这是一个平滑问题,而不是直线插值 我曾经简单地使用过scipy的径向基函数,但由于θ值在2pi-->0之间的不连续性,这些函数会产生令人讨厌的边缘效应 下面是一个玩具示例(相位的真实空间分布要混乱得多): 像这样插值角量的好方法是什么?scipy是

我有一些由不均匀采样的2D空间位置组成的数据,其中每个x,y坐标都有一个相关的相位值θ,在0和2pi之间。我希望能够将θ值插值到常规的x,y网格上。数据退化的意义在于,相同(或非常接近)的x、y位置可能与多个相位值相关,反之亦然,θ值,因此严格来说,这是一个平滑问题,而不是直线插值

我曾经简单地使用过scipy的径向基函数,但由于θ值在2pi-->0之间的不连续性,这些函数会产生令人讨厌的边缘效应

下面是一个玩具示例(相位的真实空间分布要混乱得多):


像这样插值角量的好方法是什么?scipy是否有任何内置的插值方法可以很好地处理角度,还是我必须自己编写呢?

我现在觉得自己很愚蠢

答案很简单——把我也算进去了。如果我将极坐标空间转换为笛卡尔坐标空间,然后独立插值向量的x和y分量,则不连续性没有问题:

x, y = np.random.uniform(-1, 1, size=(2, 1000))
z = np.arctan2(y, x) % (2*np.pi)

# convert from polar --> cartesian
u, v = np.cos(z), np.sin(z)

# interpolate x and y components separately
rbf_u = interpolate.Rbf(x, y, u, function='linear', smooth=0.1)
rbf_v = interpolate.Rbf(x, y, v, function='linear', smooth=0.1)
xi, yi = np.mgrid[-1:1:100j, -1:1:100j].reshape(2, -1)
ui = rbf_u(xi, yi)
vi = rbf_v(xi, yi)

# convert from cartesian --> polar
zi = np.arctan2(ui, vi) % (2*np.pi)

如果有一种方法可以避免在x和y分量上执行两个单独的插值,这将是一个很好的性能方面的问题,但我真的看不到解决这个问题的方法

x, y = np.random.uniform(-1, 1, size=(2, 1000))
z = np.arctan2(y, x) % (2*np.pi)

# convert from polar --> cartesian
u, v = np.cos(z), np.sin(z)

# interpolate x and y components separately
rbf_u = interpolate.Rbf(x, y, u, function='linear', smooth=0.1)
rbf_v = interpolate.Rbf(x, y, v, function='linear', smooth=0.1)
xi, yi = np.mgrid[-1:1:100j, -1:1:100j].reshape(2, -1)
ui = rbf_u(xi, yi)
vi = rbf_v(xi, yi)

# convert from cartesian --> polar
zi = np.arctan2(ui, vi) % (2*np.pi)