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.Dies liefert nicht wirklich das erwartete Ergebnis, hilft Ihnen aber möglicherweise dabei, nach einigen erforderlichen Korrekturen eine Lösung zu finden ...
EDIT: Geändert mit
np.arctan2
gemäß den Vorschlägen von OP.quelle
np.arctan2
sollte verwendet werden, dies führt jedoch in jedem Fall zu großen Abweichungen zu den Rändern des kartesischen Koordinatensystems. In der Realität gibt es keine Datenpunkte, aber da dieser Ansatz nur den nächsten verfügbaren Datenpunkt berücksichtigt, wird er gefüllt, während dies nicht der Fall sein sollte.skimage.transform.resize
das polare Bild um einen bestimmten Faktor aufzurüsten und eine bilineare bikubische Interpolation zu verwenden und dann diesen Ansatz zu verwenden, um die Transformation durchzuführen. Sie würden mit einer genaueren Transformation enden.Sie können das kartesische Array durchlaufen, jeden Gitterpunkt in Polarkoordinaten umwandeln und den Funktionswert durch Interpolation aus Ihren polaren Gitterdaten approximieren. Möglicherweise möchten Sie die Eckbereiche dennoch leer lassen, da nicht genügend Daten vorhanden sind.
Ich denke nicht, dass es einen besseren Weg gibt, es sei denn, Sie haben natürlich Zugriff auf die ursprüngliche Funktion.
quelle