Python 如何平滑抖动图中的噪声矢量场

Python 如何平滑抖动图中的噪声矢量场,python,matplotlib,Python,Matplotlib,我有一个数据集,我想画成一个箭筒图。该集合包含以椭圆表示的恒星参数(中心、长轴长度、短轴长度、长轴方向(角度)),我想用箭图绘制一个向量场。数据(轴长度和轴承)有噪音,我需要平滑它。虽然平滑效果很好的轴长度,我坚持与角度平滑。这里的问题是,任何椭圆在视觉上(出于我的目的)都相当于旋转180度的椭圆,椭圆的角度分布在0到180之间。此范围的大部分平滑效果良好,但角点接近0和接近180的情况除外。虽然角度接近0和接近180的两个椭圆在视觉上看起来很相似,但它们的“平均”角度为90度,这显然是错误的。

我有一个数据集,我想画成一个箭筒图。该集合包含以椭圆表示的恒星参数(中心、长轴长度、短轴长度、长轴方向(角度)),我想用箭图绘制一个向量场。数据(轴长度和轴承)有噪音,我需要平滑它。虽然平滑效果很好的轴长度,我坚持与角度平滑。这里的问题是,任何椭圆在视觉上(出于我的目的)都相当于旋转180度的椭圆,椭圆的角度分布在0到180之间。此范围的大部分平滑效果良好,但角点接近0和接近180的情况除外。虽然角度接近0和接近180的两个椭圆在视觉上看起来很相似,但它们的“平均”角度为90度,这显然是错误的。请参见平滑中断的非平滑数据示例(代表这些星星的白色星星和绿色箭头)。为了清楚起见,我不需要箭头的方向,在我的最后一个情节中,我隐藏了箭头。我只需要它的角度/方位,179.9和0.1两个角度的平均值需要是180或0,但不是90。 你知道如何解决这个问题吗

有两种选择:

首先,可以将角度转换为int,并将其扩展到该int的完整范围,然后利用溢出。例如:

np.astype((ang-180.)/360.*65536, 'uint16')
如果你的平滑函数很简单,没有比较运算符,在我看来这是一个讨厌的黑客,那么这可能会起作用

第二,任意旋转角度,多次平滑,选择最佳答案

我会平滑原稿,然后旋转120,平滑那个,旋转240,平滑那个。然后取消旋转,然后仅保持一致的角度。当然,这会带来3倍以上的性能冲击

编辑:
第三个选项:平滑向量分量。

谢谢Paul,第一个选项被取消了,因为平滑是通过局部回归完成的,不起作用。我认为第二种方法可以奏效,如果我把角度旋转三次,大约15度,再把它们转回来,取中间值。不过,这种方法并不十分优雅。我也在考虑第三种方法。但问题是类似的,向量(0.999,0)和(-0.999,0)虽然方向相同(出于我的目的),但平均值为(0,0)。如果您想要优雅,您可能需要修改平滑算法。这里有一些关于如何比较循环数的讨论:如果numpy有一个“循环”的数据类型并重写
\uuuuu add\uuuuu
\uu sub\uuu
等,那就好了。。。始终给出所需的角度结果。一定是因为什么原因没做。。我已经多次遇到角度的问题,并且总是必须
var[var>180]-=180
我的解决方法。我会对数据进行三角化,并使用波前传播来选择“最佳”的180模表示。如果你可以共享一个数据集,我将尝试发布一个答案。