如何将Python中笛卡尔坐标系下的2D高斯分布转换为极坐标形式?
2D笛卡尔高斯分布转极坐标分布实现方案
要实现你需要的极坐标高斯分布效果,有两种可行的实现路径:
方案1:直接在极坐标网格上生成高斯分布(推荐)
这种方法不需要处理笛卡尔坐标到极坐标的数值映射,直接创建极坐标网格后转换为笛卡尔坐标计算高斯值,效率和精度更高,代码如下:
import numpy as np import matplotlib.pyplot as plt # 原高斯参数 max_val, x_mean, y_mean, sig_x, sig_y, alpha = [1, 0, 0, 0.01, 0.01, 0] # 生成极坐标网格 rho = np.linspace(0, 0.5, 100) phi = np.linspace(0, 2*np.pi, 360) rho_grid, phi_grid = np.meshgrid(rho, phi) # 极坐标转笛卡尔坐标用于计算高斯值 x_grid = rho_grid * np.cos(phi_grid) y_grid = rho_grid * np.sin(phi_grid) # 计算高斯分布值 n_grid_polar = max_val * np.exp(-((x_grid - x_mean) ** 2 / (2 * sig_x) + (y_grid - y_mean) ** 2 / (2 * sig_y))) # 极坐标下绘图 fig = plt.figure(figsize=(6,6)) ax = fig.add_subplot(111, projection='polar') ax.set_title('极坐标高斯分布', pad=20) contour = ax.contourf(phi_grid, rho_grid, n_grid_polar, cmap='seismic', vmin=0, vmax=1) plt.colorbar(contour) plt.show()
方案2:已有笛卡尔网格n_grid插值映射到极坐标
如果你必须使用已经生成好的笛卡尔网格数据n_grid,可以通过插值方法将数值映射到极坐标网格,代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata # ------------ 原笛卡尔网格生成部分 ------------ max_val, x_mean, y_mean, sig_x, sig_y, alpha = [1, 0, 0, 0.01, 0.01, 0] xline = np.arange(-0.5, 0.5, 0.001) yline = np.arange(-0.5, 0.5, 0.001) x_grid, y_grid = np.meshgrid(xline, yline) n_grid = max_val * np.exp(-((x_grid - x_mean) ** 2 / (2 * sig_x) + (y_grid - y_mean) ** 2 / (2 * sig_y))) # ------------ 笛卡尔转极坐标插值部分 ------------ # 生成目标极坐标网格 rho = np.linspace(0, 0.5, 100) phi = np.linspace(0, 2*np.pi, 360) rho_grid, phi_grid = np.meshgrid(rho, phi) # 极坐标网格转笛卡尔坐标作为插值目标点 x_target = rho_grid * np.cos(phi_grid) y_target = rho_grid * np.sin(phi_grid) # 把原笛卡尔网格的坐标和数值拉平为一维数组,用于插值 points = np.vstack((x_grid.flatten(), y_grid.flatten())).T values = n_grid.flatten() # 线性插值得到极坐标网格对应的数值 n_grid_polar = griddata(points, values, (x_target, y_target), method='linear') # 极坐标下绘图 fig = plt.figure(figsize=(6,6)) ax = fig.add_subplot(111, projection='polar') ax.set_title('插值得到的极坐标高斯分布', pad=20) contour = ax.contourf(phi_grid, rho_grid, n_grid_polar, cmap='seismic', vmin=0, vmax=1) plt.colorbar(contour) plt.show()
注意事项
- 你原来的绘图代码设置了
vmin=-3但高斯分布最小值为0,会导致色阶显示异常,上面的代码已经调整为符合高斯数值范围的vmin=0 - 如果你的高斯中心不在原点,两种方案都可以正常适配,只需要修改
x_mean和y_mean参数即可
内容的提问来源于stack exchange,提问作者Desperate Morty
相关产品推荐
相关产品推荐

