2016-03-15 5 views
2

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

Позвольте мне изложить проблему:

я получить мои первоначальные RA & декабря координаты, используя эту строку:

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')) 

Игнорирование то он выглядит следующим образом:

enter image description here

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

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

ответ

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.

+0

Спасибо за ответ снова @MSeifert, это отлично работает. Я могу попытаться использовать более сложные условия, чтобы получить список целей до более управляемого размера! :) – Dean

+1

Незначительный комментарий, что для удобочитаемости ИМХО вы должны делать 'magn_below_20 & dec_above_m10', а не' np.logical_and (.., ..) '. Также будьте осторожны, что вам нужно использовать побитовые логические операторы '&' и '|', а не логические операторы 'and' и' or'. –

+0

@TomAldcroft - я отредактировал ответ. Я часто нахожу объяснения с 'np.logical_xxx' точнее, чем' '' или '&' (в зависимости от того, насколько знакомы читатели с операторами программирования), но вы правы, это более читаемо с этими операторами. – MSeifert