我用多普勒风激光雷达测量(PPI电弧扫描)。数据存储在pandas数据帧中,其中行表示方位角,列表示径向距离(输入形状= 30x197)。 Link to example scan, (csv)。我想将其转换为笛卡尔坐标系,并输出一个二维数组,该数组被重新网格化为x,y坐标而不是极坐标,其值存储在适当的网格单元格中。插值(最近邻)是正常的,因此没有数据存在的区域为零或NaN填充。
理想情况下,X和Y网格应该与点之间的实际距离相对应,但是现在我只是想让它工作。这应该不是非常困难,但我无法获得我想要的结果。 到目前为止,我的工作代码在极轴上绘制得很漂亮(example image),但这对我的分析的后续步骤不起作用。
我使用USING
,SELECT DEPARTMENT_NAME, AVG(SALARY), COUNT(COMMISSION_PCT)
FROM DEPARTMENTS
INNER JOIN EMPLOYEES on DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID
GROUP BY DEPARTMENT_NAME;
和scipy.interpolate.griddata
尝试了许多不同的方法,但没有得到正确的输出。以下是我最近尝试的示例(df_polar是链接的csv文件):
scipy.ndimage.geometric_transform
结果根本不正确,从阅读文档和示例我不明白为什么。我非常感谢任何关于我出错的提示。非常感谢!!
答案 0 :(得分:0)
我认为你可能会错误地提供griddata
。它需要笛卡尔点,如果你想在常规的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'
)
结果值看起来像这样(使用grid_spacing = 10
并翻转x和y):
import matplotlib.pyplot as plt
plt.imshow(new_grid.T, cmap='hot')
显然插入“最近”需要驯服...