gpt4 book ai didi

python - 根据从极坐标到笛卡尔坐标的变换重新排列二维数组中的数据

转载 作者:行者123 更新时间:2023-12-03 17:19:08 25 4
gpt4 key购买 nike

我有一个二维数组,表示极坐标系中位置处的函数值。例如:

import numpy as np

radius = np.linspace(0, 1, 50)
angle = np.linspace(0, 2*np.pi, radius.size)
r_grid, a_grid = np.meshgrid(radius, angle)
data = np.sqrt((r_grid/radius.max())**2
+ (a_grid/angle.max())**2)

这里 data排列在与极坐标相对应的矩形网格中。我想重新排列数组中的数据,使轴代表相应的笛卡尔坐标系。旧版与新版布局的可视化如下:
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=plt.figaspect(0.5))
ax1.set(title='Polar coordinates', xlabel='Radius', ylabel='Angle')
ax1.pcolormesh(r_grid, a_grid, data)
ax2.set(title='Cartesian coordinates', xlabel='X', ylabel='Y')
x_grid = r_grid * np.cos(a_grid)
y_grid = r_grid * np.sin(a_grid)
ax2.pcolormesh(x_grid, y_grid, data)

Example

这里明确给出了坐标,并相应地调整了绘图。我希望将数据重新排列在数据数组本身中。它应该包含所有值,可以选择填充零以适应形状(类似于 scipy.ndimage.rotate(..., reshape=True) )。

如果我手动遍历极坐标数组来计算笛卡尔坐标,结果包含理想情况下也应该填充的空白区域:
new = np.zeros_like(data)
visits = np.zeros_like(new)
for r, a, d in np.nditer((r_grid, a_grid, data)):
i = 0.5 * (1 + r * np.sin(a)) * new.shape[0]
j = 0.5 * (1 + r * np.cos(a)) * new.shape[1]
i = min(int(i), new.shape[0] - 1)
j = min(int(j), new.shape[1] - 1)
new[i, j] += d
visits[i, j] += 1
new /= np.maximum(visits, 1)
ax2.imshow(new, origin='lower')

Example attempt

有没有办法实现转换,同时避免结果数据数组中的空白区域?

最佳答案

tl;dr:不,不改变您的问题的某些条件。

您看到的人工制品是转换的属性。
这不是因为所有半径的角度分辨率都是固定的。
因此,这不是由于转换的错误或错误实现造成的。
笛卡尔网格仅意味着在这些区域具有更高的特殊分辨率,因为存在来自极坐标图的已解析点。

  • 处理这个问题的唯一“干净”方法(我现在能想到的)是在极坐标中有一个可调整的分辨率来解释 1/r 缩放。 (如果你输入数据允许的话)
  • 一种在没有间隙的情况下将其可视化的有点作弊的方法是将它们随机分布在间隙上。这里的论点是,您无法决定从哪个 bin 开始。因此,您可以将它们随机地放在一个可能是可能起源的地方,而不是将它们全部放在同一个中(就像您现在所做的那样)。
    但是,我想劝阻这种强硬。它只是给你一个更漂亮的情节。
    请注意,这在某种程度上等同于您问题中右上图的行为。
  • 关于python - 根据从极坐标到笛卡尔坐标的变换重新排列二维数组中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60615268/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com