あなたが求めている機能のいくつかを提供する2つのアプローチを考えることができます:
チャンク/またはn行のストライド/などのいずれかでファイルを読み取るには:
agenerator
をnumpy.genfromtxt および numpy.loadtxtに渡すことができます。このようにして、2 つの関数の便利な解析機能をすべて保持しながら、メモリ効率的にテキスト ファイルから大きなデータセットを読み込むことができます。
正規表現として表現できる基準に一致する行からのみデータを読み取るには: numpy.fromregexを使用し、 a
を使用して、入力ファイル内の特定の行からどのトークンを読み込む必要があるかを正確に定義できます。パターンに一致しない行は無視されます。regular expression
2 つのアプローチを説明するために、私の研究コンテキストからの例を使用します。
多くの場合、次の構造のファイルをロードする必要があります。
6
generated by VMD
CM 5.420501 3.880814 6.988216
HM1 5.645992 2.839786 7.044024
HM2 5.707437 4.336298 7.926170
HM3 4.279596 4.059821 7.029471
OD1 3.587806 6.069084 8.018103
OD2 4.504519 4.977242 9.709150
6
generated by VMD
CM 5.421396 3.878586 6.989128
HM1 5.639769 2.841884 7.045364
HM2 5.707584 4.343513 7.928119
HM3 4.277448 4.057222 7.022429
OD1 3.588119 6.069086 8.017814
これらのファイルは巨大 (GB) になる可能性があり、数値データのみに関心があります。すべてのデータ ブロックは同じサイズ6
(この例では) であり、常に 2 行で区切られています。したがって、stride
ブロックの は8
です。
最初のアプローチの使用:
まず、不要な行を除外するジェネレーターを定義します。
def filter_lines(f, stride):
for i, line in enumerate(f):
if i%stride and (i-1)%stride:
yield line
次に、ファイルを開き、filter_lines
-generator を作成し (ここでは を知る必要がありますstride
)、そのジェネレータを に渡しgenfromtxt
ます。
with open(fname) as f:
data = np.genfromtxt(filter_lines(f, 8),
dtype='f',
usecols=(1, 2, 3))
これは簡単に機能します。usecols
データの最初の列を取り除くために使用できることに注意してください。genfromtxt
同様に、型の検出、列ごとの型の変化、欠損値、コンバーターなどの他のすべての機能を使用できます。
この例data.shape
では(204000, 3)
、元のファイルが272000
行で構成されていました。
ここでgenerator
は、均一にまたがった行をフィルタリングするために使用されますが、(単純な) 基準に基づいて不均一な行のブロックを除外することも同様に想像できます。
2 番目のアプローチを使用する:
regexp
使用するのは次のとおりです。
regexp = r'\s+\w+' + r'\s+([-.0-9]+)' * 3 + r'\s*\n'
グループ (内部()
) は、特定の行から抽出されるトークンを定義します。次に、fromregex
ジョブを実行し、パターンに一致しない行を無視します。
data = np.fromregex(fname, regexp, dtype='f')
結果は、最初のアプローチとまったく同じです。