Вы должны избегать циклов и выполнять тяжелые вычисления в базовом коде C, в Numpy или в Astropy для преобразования небо / пиксель. Есть несколько вариантов сделать это с astropy.wcs
.
Первый с SkyCoord
. Давайте сначала создадим сетку значений для ваших индексов пикселей:
In [30]: xx, yy = np.mgrid[:5, :5]
...: xx, yy
Out[30]:
(array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]]), array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]))
Теперь мы можем создать объект SkyCoord
(который является подклассом массива Numpy) из индексов пикселей с использованием wcs:
In [33]: from astropy.coordinates import SkyCoord
...: sky = SkyCoord.from_pixel(xx, yy, wcs)
...: sky
Out[33]:
<SkyCoord (FK5: equinox=2000.0): (ra, dec) in deg
[[(53.17127889, -27.78771333), (53.17127889, -27.78765778),
(53.17127889, -27.78760222), (53.17127889, -27.78754667),
(53.17127889, -27.78749111)],
....
Обратите внимание, что используется wcs.utils.skycoord_to_pixel
. Этот объект также имеет метод проецирования в пиксели с помощью wcs. Я сделаю то же самое здесь для практических целей:
In [34]: sky.to_pixel(wcs)
Out[34]:
(array([[ 0.00000000e+00, -1.11022302e-16, -2.22044605e-16,
-3.33066907e-16, 1.13149046e-10],
...
[ 4.00000000e+00, 4.00000000e+00, 4.00000000e+00,
4.00000000e+00, 4.00000000e+00]]),
array([[-6.31503738e-11, 1.00000000e+00, 2.00000000e+00,
3.00000000e+00, 4.00000000e+00],
...
[-1.11457732e-10, 1.00000000e+00, 2.00000000e+00,
3.00000000e+00, 4.00000000e+00]]))
Мы получаем набор значений с плавающей запятой для новых индексов x и y. Поэтому вам нужно будет округлить эти значения и преобразовать их в int, чтобы использовать их в качестве индексов массива.
Второй вариант - использовать функции более низкого уровня, например, wcs.pixel_to_world_values
и wcs.world_to_pixel_values
, который принимает массивы Nx2 и также возвращает это:
In [37]: wcs.pixel_to_world_values(np.array([xx.ravel(), yy.ravel()]).T)
Out[37]:
array([[ 53.17127889, -27.78771333],
[ 53.17127889, -27.78765778],
[ 53.17127889, -27.78760222],
[ 53.17127889, -27.78754667],
...