从pyfits数据表中获取随机子样本

时间:2017-09-27 20:01:41

标签: python random astropy fits pyfits

我有一个非常简单的问题,但谷歌似乎无法在这里帮助我。我想要一个pyfits表的子样本...基本上只删除90%的行,或类似的东西。我用以下内容阅读了表格:

data_table = pyfits.getdata(base_dir + filename)

我喜欢使用data_table.field(fieldname)访问字段的pyfits表组织,所以我想保留数据结构,但删除行。

1 个答案:

答案 0 :(得分:4)

您可以使用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 isn't developed anymore and has been migrated to 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