Healpy query_polygon RuntimeError: неизвестное исключение - PullRequest
1 голос
/ 06 апреля 2019

Я использую healpy.query_polygon, чтобы получить список индексов healpix внутри многоугольника.Согласно документации:

вершины: массив вершин, содержащий вершины многоугольника, форма (N, 3).

Но когда я пытаюсь получить все индексы изпоявляется следующий многоугольник, RuntimeError: Unknown exception:

In [1]:

import healpy as hp

vertex_array = np.array([[0.65, -0.04, 0.76], [0.58, 0.38, 0.72], [0.91, -0.29, 0.31],[0.91, 0.18, 0.38]])

print(vertex_array.shape)
vertex_array

Out [1]:

(4, 3)
array([[ 0.65, -0.04,  0.76],
       [ 0.58,  0.38,  0.72],
       [ 0.91, -0.29,  0.31],
       [ 0.91,  0.18,  0.38]])

In [2]:

healpix_indexes_test = hp.query_polygon(4, vertex_array)

Out [2]:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-63-5a14f69cb078> in <module>
----> 1 healpix_indexes_test = hp.query_polygon(4, vertex_array)

healpy/src/_query_disc.pyx in healpy._query_disc.query_polygon()

RuntimeError: Unknown exception

Здесь Вы можете увидеть визуализацию этих точек, лежащих на сфере.

Просто для удовольствияЯ попытался транспонировать входной массив, поэтому его форма стала (3, 4).Проблема Unknown exception исчезла.Но вводимые данные противоречат документации, поэтому я не верю.

В [1]:

print(vertex_array.T.shape)
vertex_array.T

Вне [1]:

(3, 4)
array([[ 0.65,  0.58,  0.91,  0.91],
       [-0.04,  0.38, -0.29,  0.18],
       [ 0.76,  0.72,  0.31,  0.38]])

В [2]:

healpix_indexes_test_1 = hp.query_polygon(4, vertex_array.T)

healpix_indexes_test_1

Вне [2]:

array([ 42,  58,  75, 107, 123, 140])

Буду благодарен за любые предложения.

1 Ответ

2 голосов
/ 08 апреля 2019

С помощью помощи членов Healpy на Github решение было найдено.Важно правильно определить порядок вершин.В моем случае это означает, что координаты двух последних точек должны быть сдвинуты, чтобы сделать прямоугольник простым, а не самопересекающимся:

In [1]:

vertex_array_fixed = np.array([[0.65, -0.04, 0.76], [0.58, 0.38, 0.72], [0.91, 0.18, 0.38], [0.91, -0.29, 0.31]])

print(vertex_array_fixed.shape)
vertex_array_fixed

Out [1]:

(4, 3)
array([[ 0.65, -0.04,  0.76],
       [ 0.58,  0.38,  0.72],
       [ 0.91,  0.18,  0.38],
       [ 0.91, -0.29,  0.31]])

В [2]:

healpix_indexes_test = hp.query_polygon(4, vertex_array_fixed)

healpix_indexes_test

Выйти [2]:

array([24, 40, 71])

Здесь появляется визуализация:

Вход [3]:

Nside = 2048

healpix_indexes_test = hp.query_polygon(Nside, vertex_array_fixed)

healpix_indexes_test

Выход [3]:

array([ 5968575,  5968576,  5968577, ..., 17387119, 17387120, 17395310])

Вход [4]: ​​

Npix = hp.nside2npix(Nside)

whole_map = np.arange(Npix, dtype=float)
whole_map[healpix_indexes_test] = hp.UNSEEN

hp.mollview(m, title="Fixed rectangle")

Выход [4]: Выходной участок

...