亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據從極坐標到笛卡爾坐標的變換,在二維數組中重新排列數據

根據從極坐標到笛卡爾坐標的變換,在二維數組中重新排列數據

智慧大石 2022-08-25 15:43:53
我有一個二維數組,它表示極坐標系中位置的函數值。例如:import numpy as npradius = 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)這里排列在對應于極坐標的矩形網格中。我想重新排列數組中的數據,以便軸表示相應的笛卡爾坐標系。新舊布局可以按如下方式可視化:dataimport matplotlib.pyplot as pltfig, (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)這里明確給出了坐標,并相應地調整了繪圖。我希望在數據數組本身中重新排列數據。它應該包含所有值,可以選擇用零填充以適合形狀(類似于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] += 1new /= np.maximum(visits, 1)ax2.imshow(new, origin='lower')有沒有辦法在實現轉換的同時避免結果數據數組中的空白區域?
查看完整描述

3 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

tl;dr:不,不是沒有改變你的問題的一些條件。

你所看到的人工制品是轉變的一個屬性。這并不是由于所有半徑的角度具有固定的分辨率。因此,這不是由于轉換的錯誤或不良實現。笛卡爾格網只是意味著這些區域具有更高的特殊分辨率,因為極地圖中存在已解析的點。

  • 處理這個問題的唯一“干凈”方法(我現在能想到的)是在極坐標中具有可調節的分辨率,以考慮1 / r縮放。(如果輸入數據允許)

  • 一種有點作弊的可視化方式是沒有間隙,將它們隨機分布在間隙上。這里的論點是,你沒有決心決定他們從哪個箱子開始。因此,您可以隨機將它們放入一個可能是可能的起源中,而不是將它們全部扔在同一個中(就像您現在所做的那樣)。但是,我想勸阻這種詭計。它只是給你一個更漂亮的情節。請注意,這在某種程度上等同于問題中右上角繪圖的行為。


查看完整回答
反對 回復 2022-08-25
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

這并沒有真正給出預期的結果,但也許會幫助你在一些需要的糾正后實現解決方案......



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)



def polar_to_cartesian(data):

    new = np.zeros_like(data) * np.nan

    x = np.linspace(-1, 1, new.shape[1])

    y = np.linspace(-1, 1, new.shape[0])

    for i in range(new.shape[0]):

        for j in range(new.shape[1]):

            x0, y0 = x[j], y[i]

            r, a = np.sqrt(x0**2 + y0**2), np.arctan2(y0, x0)

            data_i = np.argmin(np.abs(a_grid[:, 0] - a))

            data_j = np.argmin(np.abs(r_grid[0, :] - r))

            val = data[data_i, data_j]


            if r <= 1:

                new[i, j] = val


    return new


new = polar_to_cartesian(data)

fig, ax = plt.subplots()

ax.imshow(new, origin='lower')

查看完整回答
反對 回復 2022-08-25
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

您可以遍歷笛卡爾數組,將每個網格點轉換為極坐標,并通過從極坐標數據中插值來近似函數值。不過,您可能仍希望將角落區域留空,因為缺少足夠接近的數據。

我不認為有更好的方法,除非你當然可以訪問原始功能。


查看完整回答
反對 回復 2022-08-25
  • 3 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號