NumPyは、Pythonで数値計算を行うためのライブラリです。NumPyを使うと、テキストファイルからデータを読み込んで配列として扱うことが容易になります。この記事では、テキストファイルからデータを読み込むための主要な関数であるloadtxtとgenfromtxtの基本的な使い方、違い、そして高度な利用例について解説します。
loadtxtとgenfromtxtの使い分け
どちらもテキストファイルからデータを読み込み、NumPy配列を作成するための関数です。
loadtxtとgenfromtxtの使い分け
シンプルなテキストファイルではloadtxtで十分です。欠損値を含むファイル、構造が複雑なファイルなどは、genfromtxtを使用します。loadtxtと比べ柔軟な処理が可能です。
| 機能 | loadtxt |
genfromtxt |
|---|---|---|
| 基本的な読み込み | ○ | ○ |
| 欠損値の自動処理 | × | ○ |
| 欠損値のカスタマイズ | × | ○ |
| ヘッダー行の処理 | × | ○ |
| 構造化配列 | × | ○ |
loadtxtの基本的な使い方
loadtxtは、区切り文字で区切られたシンプルなテキストファイルを読み込むのに適しています。
最もシンプルな例
import numpy as np # サンプルデータ (data.txt) # 1 2 3 # 4 5 6 data = np.loadtxt('data.txt') print(data)
このコードでは、data.txtという名前のファイルからデータを読み込み、NumPy配列としてdata変数に格納しています。loadtxtはデフォルトで空白を区切り文字として認識します。
出力
[[1. 2. 3.] [4. 5. 6.]]
区切り文字の指定
区切り文字はdelimiter引数で指定できます。例えば、カンマ区切りのファイル(data.csv)を読み込むには以下のようにします。
# サンプルデータ (data.csv) # 1,2,3 # 4,5,6 data = np.loadtxt('data.csv', delimiter=',') print(data)
特定の列の読み込み
usecols引数を使うと、特定の列だけを読み込めます。例えば、1列目と3列目だけを読み込むには以下のようにします。
# サンプルデータ (data.txt) # 1 2 3 # 4 5 6 data = np.loadtxt('data.txt', usecols=(0, 2)) print(data)
出力
[[1. 3.] [4. 6.]]
コメント行のスキップ
comments引数を使うと、指定した文字で始まる行をコメントとしてスキップできます。デフォルトでは#がコメント文字です。
# サンプルデータ (data_with_comments.txt) # # これはコメント行です # 1 2 3 # 4 5 6 data = np.loadtxt('data_with_comments.txt', comments='#') print(data)
データ型の指定
dtype引数で、読み込むデータの型を指定できます。デフォルトはfloatです。
# サンプルデータ (data.txt) # 1 2 3 # 4 5 6 data = np.loadtxt('data.txt', dtype=int) print(data)
出力
[[1 2 3] [4 5 6]]
genfromtxtの基本的な使い方
genfromtxtはloadtxtよりも高機能で、欠損値を含むデータや、より複雑な構造のテキストファイルを扱うのに適しています。
最もシンプルな例
import numpy as np # サンプルデータ (data_with_missing.txt) # 1 2 3 # 4 6 # 2列目が欠損 data = np.genfromtxt('data_with_missing.txt') print(data)
出力
[[ 1. 2. 3.] [ 4. nan 6.]]
loadtxtではエラーになるような欠損値を含む場合でも、genfromtxtはデフォルトでnan (Not a Number) で補完して読み込みます。
genfromtxtの主要な引数
genfromtxtはloadtxtのすべての機能を備えています。delimiter, usecols, comments, dtypeなどの引数はgenfromtxtでも同様に使用できます。
| 引数 | 説明 | 例 |
|---|---|---|
fname |
読み込むファイル名(またはファイルオブジェクト) | 'data.csv' |
delimiter |
区切り文字 | ',' (カンマ), '\t' (タブ), ' ' (スペース) |
usecols |
読み込む列のインデックスを指定 | (0, 2, 4) (1列目、3列目、5列目を読み込む) |
comments |
コメントとして扱う文字列の始まりを指定 | '#' (デフォルト), '%', '//' |
dtype |
読み込むデータの型 | int, float, str, (int, float, float) (各列の型を個別に指定) |
missing_values |
欠損値として認識する文字列を指定 | ['?', 'N/A', ''] |
filling_values |
欠損値を置き換える値を指定 | -999, 0, '' |
names |
Trueにすると、最初の行を列名として扱う。文字列のリストで列名を指定することも可能。 |
True, ['time', 'value1', 'value2'] |
skip_header |
ファイルの先頭からスキップする行数を指定 | 1 (最初の1行をスキップ), 0 (デフォルト: スキップしない) |
skip_footer |
ファイルの末尾から読み飛ばす行数を指定します。 | 10(最後の10行を読み飛ばします) |
欠損値の扱い
genfromtxtの強力な機能の一つは、欠損値の処理方法を細かく制御できることです。
missing_values: 欠損値として認識する文字列を指定します。filling_values: 欠損値を特定の値で置き換えます。
# サンプルデータ (data_with_missing_custom.txt) # 1,?,3 # 4,5,N/A data = np.genfromtxt('data_with_missing_custom.txt', delimiter=',', missing_values=['?', 'N/A'], filling_values=-999) print(data)
出力
[[ 1. -999. 3.] [ 4. 5. -999.]]
この例では、?とN/Aを欠損値として認識し、それらを-999で置き換えています。
応用: ヘッダー行のスキップと名前付き配列
genfromtxtは、ヘッダー行を持つファイルや、各列に名前が付いているファイルを扱う際に便利です。
# サンプルデータ (data_with_header.csv) # Time,Value1,Value2 # 0,1.0,2.0 # 1,3.0,4.0 # 2,5.0,6.0 data = np.genfromtxt('data_with_header.csv', delimiter=',', names=True, skip_header=0) print(data) print(data['Time']) print(data['Value1'])
出力
[(0., 1., 2.) (1., 3., 4.) (2., 5., 6.)] [0. 1. 2.] [1. 3. 5.]
names=True: 1行目をヘッダーとして扱い、列名として使用します。skip_header=0: ヘッダー行をスキップする行数を指定します。(今回はスキップしないので0)
これにより、data['Time']のように、列名でデータにアクセスできる構造化配列(structured array)が得られます。skip_headerで指定された行数だけ読み飛ばします。
まとめ
NumPyのloadtxtとgenfromtxtは、テキストファイルからデータをNumPy配列に読み込見ます。それぞれの関数の特性を理解し、データの形式や目的に応じて使い分けることで、効率的なデータ処理が可能になります。特に、genfromtxt は、より現実に即した複雑なデータを取り扱う場面で有用です。
現場で使える!NumPyデータ処理入門 機械学習・データサイエンスで役立つ高速処理手法 (AI & TECHNOLOGY) [ 吉田 拓真 ]