ファイルの読み込みと書き出し

NumPy を利用してタブ区切りのファイルを読み込んだりする際に loadtxt メソッド、データをファイルに保存する際に savetxt を利用する。また、各列がことなるデータ型をもつようなデータであれば、pandas モジュールの to_csv を利用すると便利。

NumPy

NumPy を利用して行列データを作成し、保存する例。

import numpy as np

arr = np.array([[23.41, 34.21, 11.22, 54.23, 42.12],
                [1.135, 2.678, 3.789, 4.910, 5.011]])

arr
## array([[ 23.41 ,  34.21 ,  11.22 ,  54.23 ,  42.12 ],
##        [  1.135,   2.678,   3.789,   4.91 ,   5.011]])

savetxt("data.txt", arr, delimiter = "\t")

実際に保存されたデータを Linux の cat コマンドで見ると以下のように見える。

cat data.txt
## 2.341000000000000014e+01	3.421000000000000085e+01	1.122000000000000064e+01	5.422999999999999687e+01	4.211999999999999744e+01
## 1.135000000000000009e+00	2.677999999999999936e+00	3.789000000000000146e+00	4.910000000000000142e+00	5.011000000000000121e+00

ファイルの読み込みは以下のようにする。

arr = np.loadtxt("data.txt", delimiter = "\t")
arr
## array([[ 23.41 ,  34.21 ,  11.22 ,  54.23 ,  42.12 ],
##        [  1.135,   2.678,   3.789,   4.91 ,   5.011]])

loadtxt の他に genfromtxt メソッドを利用してもファイルの読み込みが可能である。

arr = np.genfromtxt("data.txt", dtype = np.float, delimiter = "\t")
arr
## array([[ 23.41 ,  34.21 ,  11.22 ,  54.23 ,  42.12 ],
##        [  1.135,   2.678,   3.789,   4.91 ,   5.011]])

genfromtxt メソッドを利用することで文字列と数値の両方を含むデータファイルを読みこむこともできる。例えば以下のようなファイルを genfromtxt で読み込んでみる。

cat genes.txt
## gene_1  11.11   12.34   4.44
## gene_2  22.22   23.45   5.55
## gene_3  33.33   34.56   6.66
arr = np.genfromtxt("genes.txt", dtype = None, delimiter = "\t")
arr
## array([(b'gene_1', 11.11, 12.34, 4.44), (b'gene_2', 22.22, 23.45, 5.55),
##        (b'gene_3', 33.33, 34.56, 6.66)],
##       dtype=[('f0', 'S6'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

Pandas

Pandas を利用して行列型のサンプルデータを読む。データの読み込みは read_csv メソッドを利用する。この際に、ファイルの 1 行目がヘッダー行として処理される。ファイルにヘッダー行がない場合は header = -1 をつける。

import pandas as pd

data = pd.read_csv("https://stat.biopapyrus.net/data/rat.food.txt", sep = "\t")
data.head()
##   type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 0   PF   200   203   195   192   187   185   184   178
## 1   PF   200   187   175   165   183   178   176   172
## 2   PF   208   197   209   199   198   190   186   185
## 3   PF   208   194   202   197   194   192   192   187
## 4   PF   212   200   210   199   188   192   188   185


data = pd.read_csv("https://stat.biopapyrus.net/data/rat.food.txt", sep = "\t", header = -1)
data.head()
##       0     1     2     3     4     5     6     7     8
## 0  type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 1    PF   200   203   195   192   187   185   184   178
## 2    PF   200   187   175   165   183   178   176   172
## 3    PF   208   197   209   199   198   190   186   185
## 4    PF   208   194   202   197   194   192   192   187

データの書き出しは to_csv メソッドを利用する。その際に sep 引数で区切り文字を指定する。省略した場合は、データはカンマ区切りの CSV ファイルとして保存される。

data.to_csv("data.txt", sep = "\t")