Превратите файл fits в карту healpix

Я создал файл fits. Это просто 2D-массив, я могу визуализировать его с помощью plt.imshow(fits.getdata(my_file)). Есть ли способ превратить его в карту healpix? Если да, то дайте развернутый ответ. Если нет, объясните, почему. Любая помощь приветствуется!

Мне известно о healpy.fitsfunc.write_map(filename, m), но я борюсь с его использованием (не могу установить параметр m) и не знаю, поможет ли эта функция в моей задаче.


person Вадим Делоне    schedule 26.12.2019    source источник


Ответы (2)


Функция hp.write_map предназначена только для записи уже существующей карты healpix из памяти в соответствующий файл.

Из вашего вопроса непонятно, какие у вас данные. Но предполагая, что у вас есть двумерная сетка данных, так как вы используете imshow. Вам нужно преобразовать его в карту healpix, прежде чем использовать hp.write_map.

В зависимости от вашей системы координат вам необходимо знать координаты каждой из точек сетки, чтобы преобразовать сетку в карту healpix.

Чтобы преобразовать некоторые данные (скалярные) в карту healpix после нахождения координат, вы можете написать такую ​​функцию, которая берет координаты и создает для вас карту healpix.

def make_map_vec(theta, phi, data):
    assert len(theta) == len(phi) == len(data)
    e1map = np.full(hp.nside2npix(NSIDE), hp.UNSEEN, dtype=np.float)
    index = hp.ang2pix(NSIDE, theta, phi)
    values = np.fromiter((np.sum(data[index==i]) for i in np.unique(index)), float, count=len(np.unique(index)))
    e1map[np.unique(index)] = values
    return e1map

По этой ссылке указана система координат, используемая healpix.

person Panch93    schedule 14.01.2020

У меня та же проблема, я хочу построить 2d-массив в проекции Mollweide. Мой массив 2d представляет собой массив 180 * 360, использующий matplotlib.pyplot. imshow ось не следует за проекцией: введите здесь описание изображения

поэтому, чтобы решить эту проблему, я хочу использовать mollview healpy, но я не знаю, как преобразовать мои данные 2d-массива (180 * 360) в объект, который мог бы построить mollview.

В предыдущем ответе вы предполагаете, что данные представляют собой одномерный массив той же длины, что и тета и фи. Я попытался проверить это, сделав это:

test = np.ones((180,360))
data = test.reshape(180*360)
theta = []
phi = []
for i in range (360):
    for j in range (180):
        theta.append((j)*np.pi/180)
        phi.append((i)*np.pi/180)

theta = np.asarray(theta)
phphi = np.asarray(y)

def make_map_vec(theta, phi, data):
    assert len(theta) == len(phi) == len(data)
    e1map = np.full(hp.nside2npix(NSIDE), hp.UNSEEN, dtype=np.float)
    index = hp.ang2pix(NSIDE, theta, phi)
    values = np.fromiter((np.sum(data[index==i]) for i in np.unique(index)), float, count=len(np.unique(index)))
    e1map[np.unique(index)] = values
    return e1map

map_test = make_map_vec(theta,phi,data)
hp.mollview(map_test,title="Mollview image RING")

Я получил :

введите здесь описание изображения

что не правильно.

Знаете ли вы, есть ли другой способ получить карту из 2D-массива?

person BOUYAHIAOUI Makarim    schedule 06.02.2020