Получить случайную подвыборку из таблицы данных pyfits

У меня очень простой вопрос, но Google, похоже, не может мне помочь. Мне нужна подвыборка таблицы pyfits... просто удалите 90% строк или что-то в этом роде. Я прочитал таблицу с:

data_table = pyfits.getdata(base_dir + filename)

Мне нравится организация таблицы pyfits, где я обращаюсь к полю с помощью data_table.field(fieldname), поэтому я хотел бы сохранить структуру данных, но удалить строки.


person carl    schedule 27.09.2017    source источник
comment
Что бы это ни стоило, вам даже не нужно использовать .field(fieldname) — вы можете просто использовать синтаксис нижнего индекса, такой как data_table[fieldname] (где как data_table[x], где x — целое число, возвращает строку таблицы). Кроме того, в этом уникальном для pyfits нет ничего особенного — это просто прославленный numpy.recarray   -  person Iguananaut    schedule 04.10.2017


Ответы (1)


Вы можете использовать numpy.random.choice для создания массива содержащий несколько случайных выборов из другого массива.

В вашем случае вам нужны строки "x" из вашего data_table. Вы не можете напрямую использовать choice в таблице, но вы можете использовать len своей таблицы для random.choice:

import numpy as np
rows_numbers_to_keep = np.random.choice(len(data_table), 2, replace=False)

И затем проиндексируйте свою таблицу:

subsample = data_table[rows_numbers_to_keep]

Например (я использую astropy, потому что PyFITS больше не разрабатывается и был перенесен на astropy.io.fits< /а>):

>>> data
FITS_rec([(1, 4, 7), (2, 5, 8), (3, 6, 9), (4, 7, 0)],
         dtype=(numpy.record, [('a', 'S21'), ('b', 'S21'), ('c', 'S21')]))

>>> data[np.random.choice(len(data), 2, replace=False)]  # keep 2 distinct rows
FITS_rec([(1, 4, 7), (4, 7, 0)],
         dtype=(numpy.record, [('a', 'S21'), ('b', 'S21'), ('c', 'S21')]))

Если вы хотите разрешить получение одной и той же строки несколько раз, вы можете вместо этого использовать replace=True.

person MSeifert    schedule 27.09.2017