Как индексировать наблюдаемые координаты в астрофизической таблице

Я задал этот вопрос (Как отсортировать список наблюдаемых координат?) вчера о сортировке списка координат для удаления определенных значений ниже порога я получил отличный ответ от @MSeifert, но у меня есть таблица, в которой эти значения координат сопоставляются с другими свойствами цели (например, видимая величина и координаты Alt/Az), поэтому сейчас я прошу способ применить эту технику маскирования в списке astropy.table, а не в списке astropy.coordinates.SkyCoord из моего предыдущего вопроса.

Обрисую проблему:

Я получаю свои начальные координаты восхождения и склонения, используя эту строку:

radecs = astropy.coordinates.SkyCoord(ra=phi*u.rad, dec=(0.5*np.pi - theta)*u.rad)

Затем я конвертирую это в Table:

x=Table([radecs.ra,radecs.dec,altaz.alt,altaz.az,app_mag], names=('RA', 
'Dec','Altitude', 'Azimuth','Apparent Magnitude'))

Игнорируя столбец величины, это выглядит так:

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

Я хотел бы удалить строки, соответствующие склонению менее -10 градусов, аналогично тому, как я просил сделать это в своем первом вопросе, но также удалить всю строку данных из таблицы, а не только «радеки». ценности.

Я нашел в Интернете этот вопрос, который предполагает, что функция для удаления строк из таблиц не существует (по крайней мере, в июне 2013 года), но я думаю, что должно быть довольно простое решение моей проблемы.


person Dean    schedule 15.03.2016    source источник


Ответы (1)


Извините, что попросил вас задать еще один вопрос. Я думал, что вы, возможно, сохранили координаты в одном столбце, а не в разных столбцах.

Если они находятся в разных столбцах, это работает точно так же, как в другом ответе (но вы должны немного изменить индексацию), потому что вам нужно индексировать столбцы, а не атрибуты:

x=Table(...)
x1 = x[x['Dec'] > -10*u.degree] # Remove everything below -10degree declination
x2 = x[x['Apparent Magnitude'] < 20] # Remove every star with a magnitude above 20

поэтому x['Apparent Magnitude'] дает вам столбец 'Apparent Magnitude' и так далее.

Кроме того: Вы также можете указать более сложные условия:

magnitude_below_20 = x['Apparent Magnitude'] < 20
dec_above_m10 = x['Dec'] > -10*u.degree
# Get every row that satisfies both conditions:
x_from_comb_condition = x[magnitude_below_20 & dec_above_m10]
# or using the numpy-ufunc (gives the same result):
x_from_comb_condition = x[np.logical_and(magnitude_below_20, dec_above_m10)]

или если применяется одно условие (| или np.logical_or) или если условие не применяется (~ или np.logical_not)


Например:

from astropy.coordinates import SkyCoord
from astropy.table import Table
import astropy.units as u
import numpy as np
phi = np.linspace(0,2*np.pi,20)
theta = np.linspace(0, np.pi, 20)
radecs = SkyCoord(ra=phi*u.rad, dec=(0.5*np.pi - theta)*u.rad)
app_mag = np.random.uniform(15,25, 20)
x=Table([radecs.ra,radecs.dec,app_mag], names=('RA', 'Dec','Apparent Magnitude'))
x[x['Dec'] > -10*u.degree]

дает мне:

RA              Dec             Apparent Magnitude
deg             deg 
float64         float64         float64
0.0             90.0            20.1080708665
18.9473684211   80.5263157895   22.7223534546
37.8947368421   71.0526315789   19.4416167208
56.8421052632   61.5789473684   20.7207435685
75.7894736842   52.1052631579   19.9318711443
94.7368421053   42.6315789474   23.8544483535
113.684210526   33.1578947368   15.8981196334
132.631578947   23.6842105263   24.2866475431
151.578947368   14.2105263158   15.9503148326
170.526315789   4.73684210526   16.5505303858
189.473684211   -4.73684210526  24.194771397

тогда как полный Table был:

RA              Dec             Apparent Magnitude
deg             deg 
float64         float64         float64
0.0             90.0            20.1080708665
18.9473684211   80.5263157895   22.7223534546
37.8947368421   71.0526315789   19.4416167208
56.8421052632   61.5789473684   20.7207435685
75.7894736842   52.1052631579   19.9318711443
94.7368421053   42.6315789474   23.8544483535
113.684210526   33.1578947368   15.8981196334
132.631578947   23.6842105263   24.2866475431
151.578947368   14.2105263158   15.9503148326
170.526315789   4.73684210526   16.5505303858
189.473684211   -4.73684210526  24.194771397
208.421052632   -14.2105263158  15.4721094564
227.368421053   -23.6842105263  20.6082525987
246.315789474   -33.1578947368  21.9730819638
265.263157895   -42.6315789474  17.3627571053
284.210526316   -52.1052631579  22.7065806097
303.157894737   -61.5789473684  23.7244993197
322.105263158   -71.0526315789  19.7676029836
341.052631579   -80.5263157895  19.2663871267
0.0             -90.0           19.5025214878

так что это сохранило только строки, в которых условие было выполнено, и «игнорировало» все остальные.


Удаление строк вручную (если известен номер строки) возможно:

x.remove_row(0) # Removes the first row
x.remove_row(-1) # Removes the last row

Но обычно индексирование — это то, что вам нужно, если вы хотите отбросить строки из-за условий. remove_row больше подходит для удаления одной/двух строк вручную. Может потому что были ложные срабатывания или еще что... И работают на месте. Так что никогда не делайте x = x.remove_row(-1), потому что тогда x будет None.

person MSeifert    schedule 15.03.2016
comment
Спасибо, что снова ответили @MSeifert, это прекрасно работает. Сейчас я могу попробовать использовать более сложные условия, чтобы сократить список целей до более удобного размера! :) - person Dean; 15.03.2016
comment
Небольшой комментарий о том, что ИМХО для удобочитаемости вы должны делать magnitude_below_20 & dec_above_m10, а не np.logical_and(.., ..). Также имейте в виду, что вам нужно использовать побитовые логические операторы & и |, а не логические операторы and и or. - person Tom Aldcroft; 15.03.2016
comment
@TomAldcroft - я отредактировал ответ. Я часто нахожу, что объяснения с np.logical_xxx более точны, чем | или & (в зависимости от того, насколько читатель знаком с операторами программирования), но вы правы, с этими операторами читабельнее. - person MSeifert; 15.03.2016