我有一个非常简单的问题,但是Google似乎无法在这里为我提供帮助。我想要pyfits表的子样本...基本上只是删除90%的行,或类似的东西。我读表与:

data_table = pyfits.getdata(base_dir + filename)


我喜欢pyfits表组织,可以在其中使用data_table.field(fieldname)访问字段,因此我想保留数据结构,但要删除行。

最佳答案

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

在您的情况下,您需要data_table中的“ x”行。您不能在表上直接使用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]


例如(由于PyFITS isn't developed anymore and has been migrated to astropy.io.fits我使用了astropy):

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

关于python - 从pyfits数据表中获取随机子样本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46456300/

10-12 22:06