1

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

data_table = pyfits.getdata(base_dir + filename)

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

4

1 回答 1

4

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

在您的情况下,您需要从data_table. 您不能直接choice在 Table 上使用,但您可以len将 table 用于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

于 2017-09-27T20:25:53.880 回答