Tôi có một mảng hai chiều đại diện cho các giá trị hàm tại các vị trí trong một hệ tọa độ cực. Ví dụ:
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)
Ở đây data
được sắp xếp trong một lưới hình chữ nhật tương ứng với tọa độ cực. Tôi muốn sắp xếp lại dữ liệu trong mảng sao cho các trục đại diện cho hệ tọa độ Cartesian tương ứng. Bố cục cũ so với mới có thể được hình dung như sau:
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)
Ở đây các tọa độ được đưa ra rõ ràng và cốt truyện được điều chỉnh cho phù hợp. Tôi muốn dữ liệu được sắp xếp lại trong mảng dữ liệu thay thế. Nó nên chứa tất cả các giá trị, tùy ý điền vào các số 0 để phù hợp với hình dạng (tương tự scipy.ndimage.rotate(..., reshape=True)
).
Nếu tôi lặp thủ công các mảng cực để tính toán tọa độ Descartes, kết quả sẽ chứa các vùng trống cũng lý tưởng nhất phải được điền vào:
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')
Có cách nào để đạt được sự chuyển đổi trong khi tránh các vùng trống trong mảng dữ liệu kết quả không?
1/r
trước khi chuyển đổi sang tọa độ Descartes được tính toán. Kết quả có vẻ đầy hứa hẹn, chỉ còn một vài hiện vật xung quanhy = 0
, vì vậy tôi vẫn đang xem xét nó.