【问题标题】:Python: How to unwrap circular data to remove discontinuities?Python:如何解开循环数据以消除不连续性?
【发布时间】:2019-05-01 14:24:21
【问题描述】:

我有一个循环数据网格,例如数据由从0π 的角度给出。在这个数据中,我有另一个较小的网格。

这可能看起来像这样:

我想要做的是在红点上插入黑色数据。因此我使用scipy.interpolate.griddata。这会给我以下结果:

如您所见,当角度从“几乎0”变为“几乎π”时会出现不连续性。

为了消除它,我尝试在插值之前解包数据。根据这个答案(here)。我得到了这个(更好的)结果,但令人惊讶的是,右边有一个我不理解的新不连续性。

所以我的问题是:如何使用np.unwrap 获得连续插值?或者有更好的方法吗?

这里是重现的代码:

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import griddata

ax = plt.subplot()
ax.set_aspect(1)

# Simulate some given data.
x, y = np.meshgrid(np.linspace(-10, 10, 20), np.linspace(-10, 10, 20))
phi = np.arctan2(y, x) % (2 * np.pi)
data = np.arctan2(np.cos(phi), np.sin(phi)) % np.pi

# Plot data.
u = np.cos(data)
v = np.sin(data)
ax.quiver(x, y, u, v, headlength=0.01, headaxislength=0, pivot='middle', units='xy')

# Create a smaller grid within.
x1, y1 = np.meshgrid(np.linspace(-6, 5, 20), np.linspace(-4, 8, 25))
# ax.plot(x1, y1, '.', color='red', markersize=2)

# Prepare data.
data = np.unwrap(2 * data) / 2

# Interpolate data on grid.
interpolation = griddata((x.flatten(), y.flatten()), data.flatten(), (x1.flatten(), y1.flatten()))

# Plot interpolated data.
u1 = np.cos(interpolation)
v1 = np.sin(interpolation)
ax.quiver(x1, y1, u1, v1, headlength=0.01, headaxislength=0, pivot='middle', units='xy',
          scale=3, width=0.03, color='red')

plt.show()

【问题讨论】:

  • 好吧,展开只适用于一维。第二个间断具有完全相同的性质。您可能可以沿一个维度展开和插值,然后沿另一个维度进行插值。我稍后会尝试添加代码
  • 不,第二个的性质不完全相同。因为:虽然第一个对称地沿整个 y 轴(即y < 0y > 0),但第二个完全适合x < 0,但不适用于x > 0。这个我完全不明白。为什么它不会在整个 x 轴上产生不连续性?

标签: python numpy grid interpolation word-wrap


【解决方案1】:

要在circular quantities 上正确操作,请在调用griddata 之前将角度转换为复数,然后再转换为角度:

c=np.exp(2j*data)  # 0,pi -> 1
# …
a=np.angle(interpolation)/2

2 的因数将 [0,π) 扩展到整个圆,然后再返回。请注意,对angle 的调用中隐含的规范化将对输入数据的一个“网格单元”内变化太大的输入非常敏感。

【讨论】:

  • 太棒了!非常感谢你! :)
猜你喜欢
  • 2021-11-14
  • 2019-04-09
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多