Python:如何在网格上插入角度?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:如何在网格上插入角度?相关的知识,希望对你有一定的参考价值。
我有一个带有一些给定数据的网格。这个数据是由它的角度给出的(从0
到π
)。在这个网格中我有另一个较小的网格。
这可能如下所示:
现在我想在该网格上插入角度。
我尝试使用scipy.interpolate.griddata
得到了一个好结果。但是当角度从几乎0
变为几乎π
(因为中间是π/2
......)时会出现问题
这是结果,很容易看出出了什么问题。
我该如何处理这个问题?谢谢! :)
这是重现的代码:
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))
data = np.arctan(y / 10) % np.pi
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(-1, 5, 15), np.linspace(-6, 2, 20))
# ax.plot(x1, y1, '.', color='red', markersize=2)
# Interpolate data on grid.
interpolation = griddata((x.flatten(), y.flatten()), data.flatten(), (x1.flatten(), y1.flatten()))
u1 = np.cos(interpolation)
v1 = np.sin(interpolation)
ax.quiver(x1, y1, u1, v1, headlength=0.01, headaxislength=0, pivot='middle', units='xy',
color='red', scale=3, width=0.03)
plt.show()
编辑:
感谢@bubble,有一种方法可以在插值前调整给定的角度,使得结果符合要求。因此:
- 定义整流功能:
def RectifyData(data): for j in range(len(data)): step = data[j] - data[j - 1] if abs(step) > np.pi / 2: data[j] += np.pi * (2 * (step < 0) - 1) return data
- 插值如下:
interpolation = griddata((x.flatten(), y.flatten()), RectifyData(data.flatten()), (x1.flatten(), y1.flatten())) u1 = np.cos(interpolation) v1 = np.sin(interpolation)
答案
我尝试直接插值cos(angle)
和sin(angle)
值,但这仍然产生停止,导致错误的线方向。主要思想包括减少停产,例如[2.99,3.01, 0.05,0.06]
应该转变成这样的东西:[2.99, 3.01, pi+0.05, pi+0.06]
。这是正确应用2D插值算法所必需的。几乎同样的问题在以下post中提出。
def get_rectified_angles(u, v):
angles = np.arcsin(v)
inds = u < 0
angles[inds] *= -1
# Direct approach of removing discontinues
# for j in range(len(angles[1:])):
# if abs(angles[j] - angles[j - 1]) > np.pi / 2:
# sel = [abs(angles[j] + np.pi - angles[j - 1]), abs(angles[j] - np.pi - angles[j-1])]
# if np.argmin(sel) == 0:
# angles[j] += np.pi
# else:
# angles[j] -= np.pi
return angles
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(-1, 5, 15), np.linspace(-6, 2, 20))
angles = get_rectified_angles(u.flatten(), v.flatten())
interpolation = griddata((x.flatten(), y.flatten()), angles, (x1.flatten(), y1.flatten()))
u1 = np.cos(interpolation)
v1 = np.sin(interpolation)
ax.quiver(x1, y1, u1, v1, headlength=0.01, headaxislength=0, pivot='middle', units='xy',
color='red', scale=3, width=0.03)
可能,numpy.unwrap
函数可用于修复不连续。在1d数据的情况下,numpy.interp
有关键字period
来处理周期性数据。
以上是关于Python:如何在网格上插入角度?的主要内容,如果未能解决你的问题,请参考以下文章