概要

loadtxtとgenfromtxtでファイルからデータを読み込む。

個人的に他の言語で出力し他ファイルと連携して使うことが多いので、このあたりの処理はよく使う。

csv/tsvの読み込み

csv読み込み。

import numpy as np
data = np.loadtxt("foo.csv",delimiter=",")

ヘッダ行を飛ばす。skiprowsを指定。

data = np.loadtxt("foo.csv",delimiter=",", skiprows=1)

tsvの読み込み。

data = np.loadtxt("foo.tsv",delimiter="\t")

列を指定して読み込み。usecols指定。下記は1,2,4列目を読む。

data = np.loadtxt("bar.csv",delimiter="\t", usecols=(0,1,3))

loadtxtとgenfromtxt

genfromtxtはloadtxtの機能に加えてmissing values handled as specifiedなことをしてくれるらしい。

試しに下記のような穴が空いたCSVを読み込ませる。

10,,3
12,1,
5,,

これをloadtxtで読み込ませると、下記のようなエラーになる。

ValueError: could not convert string to float: 

これをgenfromtxtで読むと。

np.loadtxt( "foo.csv", delimiter=","  )

下記のように読み込まれる。

[[ 10.  nan   3.]
 [ 12.   1.  nan]
 [  5.  nan  nan]]

デフォルト値を決めておくこともできる。

np.genfromtxt( "foo.csv", delimiter=",", filling_values=(0, 0, 0) )
[[ 10.   0.   3.]
 [ 12.   1.   0.]
 [  5.   0.   0.]]

dtypeを指定して読み込む

下記は小さいunsigned intばっかの例。下記はuinit8だからunsignedの8bit。

np.genfromtxt( "foo.csv", delimiter="\t", dtype=np.uint8 )

次に複数のdtypeを指定してみる。読み込むファイルは下記のような「string int float」を想定。

col1	col2	col3
foo	10	20.5
bar	13	12.85
baz	19	11.11
np.genfromtxt( "foo.csv", delimiter="\t", skiprows=1,
    dtype=[('col1', 'S10'), ('col2', 'i8'), ('col3', 'f8')] )

S3は文字列で3byteの意。上記の例で2を指定すると、下記のように途中で切られて読み込まれる。

[('fo', 10, 20.5) ('ba', 13, 12.85) ('ba', 19, 11.11)]

dtypeが混ざったものに対してsumとかしてもエラーになる。

TypeError: cannot perform reduce with flexible type

もちろんcolumnを指定すれば動く。

np.sum( data[:, 2] )

また、dtypeがSだと日本語は読めない。UnicodeのUを指定すればいける気がするけど、そのままだとbytecodeで来るからエラーになる。converterを噛ませれば読めるか。

converterを噛ませる

日本語を読み込ませる為に、convertersを指定してみる。下記は1列目に日本語が来ると仮定して、U10(Unicodeで10文字)をdtypeに指定し、0列目に対してdecodeする処理を入れている。

np.loadtxt( "foo.csv", delimiter="\t", skiprows=1,
    dtype=[('col1', 'U10'), ('col2', 'i8'), ('col3', 'f8')],
    converters={0: lambda s: s.decode('utf8')} )

下記のような形式が読み込める。

col1	col2	col3
ふー	10	20.5
ばー	13	12.85
ばず	19	11.11

convertersに指定すればいろいろ変換できて便利。

単純な例として、マイナスの値は0になってもらう。文字列で値は来るのでfloatに変換して処理。

np.genfromtxt( "foo.csv", delimiter=",",
    converters={ 1: lambda i: 0.0 if float(i) < 0.0 else float(i) })

csv/tsvの出力

csvの出力。

np.savetxt("bar.csv", data, delimiter=",")

gzip出力。拡張子がgzなら勝手にgzip圧縮される。bz2はダメ。

np.savetxt("bar.csv.gz", data, delimiter=",")

header付きcsv出力。

np.savetxt("bar.csv", data, delimiter=",", header="column1,column2")

出力形式の変更。fmtを指定。下記は小数点以下2桁まで出力。

np.savetxt("bar.csv", data, delimiter=",", fmt='%.2f')