Tengo una matriz bidimensional que representa valores de función en posiciones en un sistema de coordenadas polares. Por ejemplo:
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)
Aquí el data
se organiza en una cuadrícula rectangular correspondiente a las coordenadas polares. Quiero reorganizar los datos en la matriz de modo que los ejes representen el sistema de coordenadas cartesianas correspondiente. El diseño antiguo versus el nuevo se puede visualizar de la siguiente manera:
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)
Aquí las coordenadas se dan explícitamente y la gráfica se ajusta en consecuencia. Quiero que los datos se reorganicen en la matriz de datos en su lugar. Debe contener todos los valores, opcionalmente rellenando con ceros para ajustarse a la forma (similar a scipy.ndimage.rotate(..., reshape=True)
).
Si hago un bucle manual sobre las matrices polares para calcular las coordenadas cartesianas, el resultado contiene regiones vacías que idealmente también deberían llenarse:
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')
¿Hay alguna manera de lograr la transformación evitando regiones vacías en la matriz de datos resultante?
fuente
1/r
antes de que se calcule la transformación a coordenadas cartesianas. Los resultados parecen prometedores, soloy = 0
quedan algunos artefactos , así que todavía lo estoy investigando.Esto realmente no da el resultado esperado, pero tal vez lo ayudará a lograr una solución después de algunas correcciones necesarias ...
EDITAR: Modificado utilizando
np.arctan2
según las sugerencias de OP.fuente
np.arctan2
debe utilizar, pero en cualquier caso esto introduce grandes discrepancias hacia los bordes del sistema de coordenadas cartesianas. En realidad, no hay puntos de datos, pero dado que este enfoque solo considera el punto de datos disponible más cercano, se llena mientras no debería.skimage.transform.resize
muestra polar de la imagen polar por un factor dado y usar una interpolación bilineal o bicúbica y luego usar este enfoque para hacer la transformación. Terminarías con una transformación más precisa.Podría recorrer la matriz cartesiana, transformando cada punto de la cuadrícula en coordenadas polares y aproximando el valor de la función mediante la interpolación de los datos de la cuadrícula polar. Sin embargo, es posible que desee dejar en blanco las regiones de la esquina, por falta de datos lo suficientemente cercanos.
No creo que haya una mejor manera, a menos que, por supuesto, tenga acceso a la función original.
fuente