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?
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.