Python/SciPy:将数据帧从极坐标网格转换为笛卡尔网格的问题

Python/SciPy:将数据帧从极坐标网格转换为笛卡尔网格的问题,python,pandas,numpy,scipy,Python,Pandas,Numpy,Scipy,我用多普勒测风激光雷达进行了测量(PPI电弧扫描)。数据存储在数据框中,其中行表示方位角,列表示径向距离(输入形状=30x197)。我想将其转换为笛卡尔坐标系,并输出一个二维数组,该数组被重新网格化为x,y坐标,而不是极坐标,其值存储在相应的网格单元中。插值(最近邻)是可以的,不存在数据的区域的零填充或非零填充也是可以的 理想情况下,X和Y网格应该与点之间的实际距离相对应,但现在我只是想让它正常工作。这应该不会太难,但我很难得到我想要的结果。 到目前为止,我已经有了在极轴上绘制精美的工作代码,但

我用多普勒测风激光雷达进行了测量(PPI电弧扫描)。数据存储在数据框中,其中行表示方位角,列表示径向距离(输入形状=30x197)。我想将其转换为笛卡尔坐标系,并输出一个二维数组,该数组被重新网格化为x,y坐标,而不是极坐标,其值存储在相应的网格单元中。插值(最近邻)是可以的,不存在数据的区域的零填充或非零填充也是可以的

理想情况下,X和Y网格应该与点之间的实际距离相对应,但现在我只是想让它正常工作。这应该不会太难,但我很难得到我想要的结果。 到目前为止,我已经有了在极轴上绘制精美的工作代码,但这对我接下来的分析步骤不起作用

我用
scipy.interpolate.griddata
scipy.ndimage.geometric_transform
scipy.ndimage.map_坐标
尝试了许多不同的方法,但没有得到正确的输出。以下是我最近尝试的一个示例(df_polar是链接的csv文件):


结果根本不正确,从阅读文档和示例中,我不明白为什么。如果有任何关于我哪里出了问题的提示,我将不胜感激。非常感谢

我认为您可能输入了错误的点。它需要笛卡尔点,如果希望在常规x/y栅格上插值,则需要创建一个并提供该点

试试这个,让我知道它是否产生了预期的结果。我很难说这是不是它应该生产的产品:

from scipy.interpolate import griddata
import pandas as pd
import numpy as np

df_polar = pd.read_csv('onescan.txt', index_col=0)

# Generate polar and cartesian meshgrids
r = pd.to_numeric(df_polar.columns)
theta = np.deg2rad(df_polar.index)

# Polar meshgrid
rad_c, theta_c = np.meshgrid(r, theta)

# Cartesian equivalents of polar co-ordinates
X = rad_c*np.cos(theta_c)
Y = rad_c*np.sin(theta_c)

# Cartesian (x/y) meshgrid
grid_spacing = 100.0   # You can change this
nx = (X.max() - X.min())/grid_spacing
ny = (Y.max() - Y.min())/grid_spacing
x = np.arange(X.min(), X.max() + grid_spacing, grid_spacing)
y = np.arange(Y.min(), Y.max() + grid_spacing, grid_spacing)
grid_x, grid_y = np.meshgrid(x, y)

# Interpolate from polar to cartesian grid
new_grid = griddata(
    (X.flatten(), Y.flatten()),
    df_polar.values.flatten(),
    (grid_x, grid_y),
    method='nearest'
)
结果值如下所示(栅格间距为10,翻转x和y):


清楚地插入“最近的”需要驯服…

你的
新网格在最后是什么形状?我得到了
(59105910)
。我刚刚意识到有一个非常类似的问题。谢谢你的链接,尽管搜索了很多次,但我没有看到那篇帖子!嗨,比尔,非常感谢你在这方面的帮助!我现在明白了,我之前通过的(x,y)笛卡尔网格只是极点的变换,需要在正常间隔的平面上重新网格化。感谢您发现并纠正了这一点。你是对的,最近邻插值的行为很奇怪。如果我使用线性插值重新运行(并反转值以获得正确的方向),那么这就是我的结果:这看起来很棒,但我应该使用最近邻法。有什么建议吗?哇,看起来很棒。我不能提供更多的建议,因为我以前从未使用过。最近邻是否提供任何选项,例如限制NN的距离?如果您确实无法获得
griddata
来执行您想要的操作,您可以自己执行最近邻插值。或者可能有用。请随意发送@Elliot。谢谢Bill,我已经对此进行了更多思考,您是对的,我需要在scipy的griddata函数的当前状态下手动执行NN插值。我将尝试继续检查点是否在扫描的凸包内:
from scipy.interpolate import griddata
import pandas as pd
import numpy as np

df_polar = pd.read_csv('onescan.txt', index_col=0)

# Generate polar and cartesian meshgrids
r = pd.to_numeric(df_polar.columns)
theta = np.deg2rad(df_polar.index)

# Polar meshgrid
rad_c, theta_c = np.meshgrid(r, theta)

# Cartesian equivalents of polar co-ordinates
X = rad_c*np.cos(theta_c)
Y = rad_c*np.sin(theta_c)

# Cartesian (x/y) meshgrid
grid_spacing = 100.0   # You can change this
nx = (X.max() - X.min())/grid_spacing
ny = (Y.max() - Y.min())/grid_spacing
x = np.arange(X.min(), X.max() + grid_spacing, grid_spacing)
y = np.arange(Y.min(), Y.max() + grid_spacing, grid_spacing)
grid_x, grid_y = np.meshgrid(x, y)

# Interpolate from polar to cartesian grid
new_grid = griddata(
    (X.flatten(), Y.flatten()),
    df_polar.values.flatten(),
    (grid_x, grid_y),
    method='nearest'
)
import matplotlib.pyplot as plt
plt.imshow(new_grid.T, cmap='hot')