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

Get random subsample from pyfits data table

我有一个很简单的问题,但是 Google 似乎不能帮到我。我想要一个 pyfits table 的子样本...基本上只是删除 90% 的行,或类似的东西。我阅读了 table 与:

data_table = pyfits.getdata(base_dir + filename)

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

您可以使用 numpy.random.choice 创建一个包含来自另一个数组的多个随机选项的数组。

在您的情况下,您需要 data_table 中的 "x" 行。您不能直接在 Table 上使用 choice,但可以将 table 的 len 用于 random.choice:

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

然后索引你的 table:

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