Ich habe ein zweidimensionales Array, das Funktionswerte an Positionen in einem Polarkoordinatensystem darstellt. Zum Beispiel:
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)
Hier data
ist das in einem rechteckigen Gitter angeordnet, das den Polarkoordinaten entspricht. Ich möchte die Daten im Array so neu anordnen, dass die Achsen das entsprechende kartesische Koordinatensystem darstellen. Das alte und das neue Layout können wie folgt dargestellt werden:
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)
Hier werden die Koordinaten explizit angegeben und das Diagramm entsprechend angepasst. Ich möchte, dass die Daten stattdessen im Datenarray selbst neu angeordnet werden. Es sollte alle Werte enthalten und optional mit Nullen gefüllt sein, um der Form zu entsprechen (ähnlich wie scipy.ndimage.rotate(..., reshape=True)
).
Wenn ich die polaren Arrays manuell durchlaufe, um die kartesischen Koordinaten zu berechnen, enthält das Ergebnis leere Bereiche, die idealerweise auch gefüllt werden sollten:
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')
Gibt es eine Möglichkeit, die Transformation zu erreichen und gleichzeitig leere Bereiche im resultierenden Datenarray zu vermeiden?
1/r
bevor die Transformation in kartesische Koordinaten berechnet wird. Die Ergebnisse sehen vielversprechend aus, es sind nur noch wenige Artefaktey = 0
übrig, also beschäftige ich mich noch damit.