loadtxtとgenfromtxtでファイルからデータを読み込む。
個人的に他の言語で出力し他ファイルと連携して使うことが多いので、このあたりの処理はよく使う。
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))
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.]]
下記は小さい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を噛ませれば読めるか。
日本語を読み込ませる為に、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の出力。
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')