Эффективно получайте среднюю точку изображения в Python с помощью астропии

Мои данные организованы в таблицу в формате соответствия (example.fits). Я открываю эту таблицу ('mappars') с помощью модуля Python atpy. В таблице есть столбцы x, y, которые представляют собой координаты изображения, и столбец данных z. Координаты x, y расположены равномерно (события на ПЗС-детекторе), но между ними есть промежутки.

Я получаю такое значение в середине изображения:

import atpy
import numpy as np

mappars = atpy.Table('example.fits')
#get midpoint value
midx = np.int((np.max(mappars['x'])+np.min(mappars['x']))/2)
midy = np.int((np.max(mappars['y'])+np.min(mappars['y']))/2)
midist = mappars.where((mappars.x == midx) & (mappars.y == midy)['z']

Есть ли более эффективный способ сделать это (без функции .where, которая является частью atpy)? Также существует ли функция, соответствующая .where в astropy.table, поскольку я хотел бы перейти с atpy на astropy?


person Florian    schedule 19.05.2016    source источник


Ответы (1)


Вы должны иметь возможность сделать это очень похожим образом, используя astropy.io и numpy. У меня нет под рукой файла событий, но что-то вроде:

from astropy.io import соответствует import numpy as np

with fits.open("example.fits") as hdulist:
    events = hdulist[1].data   # since hdu 0 should be an ImageHDU type, the events are probably in the first extension
    midx = np.int((np.max(events['x'])+np.min(events['x']))/2)
    midy = np.int((np.max(events['y'])+np.min(events['y']))/2)
    midist = events['z'][(events['x'] == midx) & (events['y'] == midy)]

В этом случае я напрямую создаю массив логических индексов для events['z'], используя логическое (numpy) выражение events['x'] == midx) & (events['y'] == midy).

Обратите внимание, что это не проверено; Если вышеуказанное не подходит для вас, я, вероятно, могу попытаться вытащить файл события где-нибудь из Интернета, чтобы проверить его, если, конечно, ваш файл событий не является специфическим.


Кстати, если x и y являются, скажем, целочисленными пиксельными координатами, вы можете немного упростить задачу, используя чистое целочисленное деление и пропустив приведение к int:

midx = (np.max(events['x'])+np.min(events['x']))//2
midy = (np.max(events['y'])+np.min(events['y']))//2

Это работает напрямую в Python 3 и в Python 2, если у вас from __future__ import division (вам, вероятно, все равно стоит это сделать).

person Community    schedule 20.05.2016
comment
Спасибо, это сработало! Я внес только два небольших изменения в код, чтобы он работал с конкретным форматом моей таблицы. Также from __future__ import division работал хорошо (с использованием Python 2.7). - person Florian; 20.05.2016
comment
Хороший. Кроме того, ваша правка была правильной, но была отклонена, потому что она была настолько специализированной, что рецензенты не распознали (очевидную) ошибку, которую я сделал, и ваше исправление. Я исправил это сейчас сам. - person ; 20.05.2016