2015-04-05 48 views
2

我有一个数据集,我想绘制为颤抖阴谋。该集合包含以椭圆形表示的恒星参数(中心,长轴长度,短轴长度,长轴的方位(角度)),我想绘制为具有颤抖图的矢量场。数据(轴长和轴承)很嘈杂,我需要平滑它。虽然平滑对轴长度工作正常,但我被卡住的角度平滑。这里的问题是任何椭圆在视觉上(和我的目的)都等价于一个椭圆旋转了180度,椭圆的角度分布在0到180的范围内。这个范围的大部分平滑工作很好,除了角度接近于0并且接近180°的角部情况。虽然角度接近于0且接近180度的两个椭圆看起来在视觉上相似,但它们的“平均”具有90度的角度,这显然是错误的。查看平滑过程中未平滑数据(代表这些恒星的白色星星和绿色箭头)的示例。要清楚我不需要箭头的方向,并且在我最后的情节中,我隐藏了箭头。我只需要它的角度/方位,两个角度179.9和0.1的平均值需要是180或0但不是90. 任何想法如何解决这个问题? part of quiver plot that shows corner case如何平滑颤动阴谋的嘈杂的矢量场

+0

我会对数据进行三角测量,并使用波前传播来选择模数180的“最佳”表示。如果您可以共享数据集,我将尝试发布答案。 – GBy 2015-04-05 16:56:01

回答

1

两个选项:

首先,您可以将您的角度转换成int和扩大到了全范围的整型,并采取溢出的优势。例如:

np.astype((ang-180.)/360.*65536, 'uint16') 

如果你的平滑功能简单,没有它比较运营商和在我看来一个讨厌的黑客,这可能工作。第二,旋转你的角度一些任意的数量,并做多次平滑,挑选最佳答案。

我会平滑原来的,然后旋转120,平滑,旋转240,平滑。然后取消旋转,然后只保留同意的角度。当然,这带来了3倍以上的性能提升。

编辑: 第三种选择:平滑矢量分量。

+0

谢谢保罗,第一个出来是因为平滑是通过局部回归完成的,并且不起作用。我认为第二个可以工作,如果我通过15度旋转角度三次,将它们旋转回中间位置。仍然这种方法是不是很优雅。我也在想第三种方法。但问题是相似的,矢量(0.999,0)和(-0.999,0),同时具有相同的方向(用于我的目的)将平均为(0,0) – 2015-04-05 14:45:43

+1

如果你想要优雅,你可能需要修补用平滑算法。以下是关于如何比较循环数的一些讨论:https://groups.google.com/forum/#!topic/comp.lang.python/6grSponecHw如果numpy的数据类型为“cyclic”,那将会很好,并覆盖'__add__','__sub__'等等以始终给出所需的角度结果。必须有一些原因,它没有完成..我已经遇到了这个问题的角度无数次,并一直不得不'var [var> 180] - = 180'出我的出路。 – Paul 2015-04-05 15:43:03