python - Python:如何解开循环数据以消除不连续性?
问题描述
我有一个圆形数据网格,例如数据由它的角度从0
到给出π
。在这个数据中,我有另一个较小的网格。
这可能看起来像这样:
我想要做的是在红点上插入黑色数据。因此我使用scipy.interpolate.griddata
. 这会给我以下结果:
如您所见,当角度从“几乎0
”变为“几乎π
”时存在不连续性。
为了消除它,我尝试在插值之前解开数据。根据这个答案(这里)。我得到了这个(更好的)结果,但令人惊讶的是,右边有一个我不明白的新不连续性。
所以我的问题是:如何使用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()
解决方案
要在循环量上正确操作,请在调用之前将角度转换为复数,然后再转换为griddata
角度:
c=np.exp(2j*data) # 0,pi -> 1
# …
a=np.angle(interpolation)/2
2 的因子将您的 [0,π) 扩展到整个圆圈并再次返回。请注意,调用中隐含的规范化angle
对输入数据的一个“网格单元”内变化太大的输入非常敏感。
推荐阅读
- c++ - 在这个 C/C++ 示例中,clang 是否真的以最佳方式添加向量?
- r - 一种使 as.Date 对格式更加谨慎的方法
- java - Java addActionListener,多个实例正在发生
- performance - 为什么 Google Pagespeed Insights 在进行更改后不更新分数?
- kotlin - 无法为递增和递减运算符定义运算符扩展函数
- express - 收到 webhook 时如何渲染视图?
- ios - Spring() 动画完成后 SwiftUI 执行操作
- flutter - 如何在颤振中返回用户流
- html - 如何在 Ruby on Rails HTML 页面中应用 css 样式?
- oracle - 无法从 Kubernetes 内部连接外部 Oracle 数据库