pythonは、数値データの分析を行うのに非常に便利な言語であるが、データの分析を行うまず第一歩として、データを読み込まなければならない。
そこで、様々な形式の数値データをnumpy配列の形式で読み込む方法をまとめる。
以下、全ての場合においてファイルの中身を'data'の中に格納する。
csv(テキスト)ファイルの読み込み
filename.csv
year,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2001,-0.4,-0.3,-0.2,-0.1,0,0,-0.1,-0.2,-0.3,-0.4,-0.5,-0.4
2002,-0.3,-0.1,0,0.3,0.4,0.5,0.6,0.7,0.8,1,1,1
2003,0.8,0.5,0,-0.2,-0.2,-0.2,-0.1,0.1,0.3,0.4,0.4,0.4
2004,0.4,0.3,0.1,0,-0.1,0,0,0.2,0.3,0.4,0.4,0.3
2005,0.2,0.1,0.1,0.1,0.2,0.3,0.2,0.1,-0.2,-0.5,-0.7,-0.8
2006,-0.8,-0.7,-0.5,-0.3,-0.2,0.1,0.3,0.4,0.6,0.8,0.9,0.8
2007,0.5,0.2,-0.2,-0.5,-0.6,-0.7,-0.9,-1.1,-1.3,-1.4,-1.5,-1.5
2008,-1.4,-1.1,-0.8,-0.5,-0.1,0.1,0.2,0.2,0.2,0,-0.2,-0.4
2009,-0.5,-0.5,-0.3,0,0.3,0.5,0.7,0.8,0.9,1,1,1.1
2010,1.1,0.9,0.7,0.3,0,-0.4,-0.8,-1.1,-1.3,-1.4,-1.5,-1.4
2011,-1.2,-0.9,-0.7,-0.4,-0.2,-0.2,-0.2,-0.4,-0.6,-0.8,-0.8,-0.7
2012,-0.6,-0.3,-0.1,0.1,0.3,0.4,0.5,0.5,0.4,0.2,0,-0.2
2013,-0.2,-0.3,-0.4,-0.4,-0.5,-0.6,-0.6,-0.5,-0.3,-0.2,-0.1,-0.2
2014,-0.2,-0.1,0,0.2,0.4,0.5,0.5,0.5,0.6,0.7,0.7,0.6
2015,0.5,0.5,0.6,0.8,1.2,99.9,99.9,99.9,99.9,99.9,99.9,99.9
メモ帳で開いた時に以上のように表示されるテキストデータを読み込む。
import numpy as np
data = np.loadtxt('filename.csv', comments='year', delimiter=',', dtype='float')
解説
- commentsで、読み飛ばす行の左端に存在する文字列を指定する。
- delimiterで、区切り文字を指定する。もしスペースで区切ってあった場合には、delimiter=...という記述は必要ない。
- dtypeで、データをどの形式で読み込むかを指定する。デフォルトはfloat(浮動小数点数)。整数として読み込みたい場合にはintとすればよい。
参考URL
- http://d.hatena.ne.jp/y_n_c/20091117/1258423212
- http://kaiseki-web.lhd.nifs.ac.jp/documents/Python/textfile.htm
- http://seesaawiki.jp/met-python/d/%A5%D5%A5%A1%A5%A4%A5%EBI/O
NetCDFファイルの読み込み
import netCDF4
nc = netCDF4.Dataset('filename.nc', 'r')
data = nc.variables['varname'][:]
解説
- import numpyをしなくても、numpyの配列として読み込んでくれる。
- varnameの部分には、当該変数名を入力する。
- 読み込むデータが何次元の配列であっても、3行目の最後の部分は[:]で構わない。
参考URL
- http://qiita.com/okadate/items/954574a95545b06ca257
- http://seesaawiki.jp/met-python/d/%A5%D5%A5%A1%A5%A4%A5%EBI/O
Fortranバイナリファイルの読み込み
write_binary_2D.f90
program main
implicit none
integer,parameter::N=10,M=20
integer::i,j
real,dimension(1:N,1:M)::x
open(10,file='filename.out',form='unformatted',access='direct',recl=N*4)
do i = 1,N
do j = 1,M
x(i,j) = i+j*2
end do
end do
do j = 1,M
write(10,rec=j)(x(i,j),i=1,N)
end do
close(10)
end program main
以上のプログラムで作成したfilename.out(リトルエンディアンのヘッダなし4バイト浮動小数点バイナリ。俗に言うGrADS形式と呼ばれるもの)の中身を読み込んでみる。
import numpy as np
N = 10 # 1レコード番号あたりに格納されているデータの数。
M = 20 # レコードの総数。
f = open('filename.out', 'r')
dty = np.dtype([('data', '<' + str(N) + 'f')])
chunk = np.fromfile(f, dtype=dty, count=M)
data = np.array([chunk[j]['data'] for j in range(M)])
解説
-
最終行は、
data = []
for j in range(M):
data.append(chunk[j]['data'])
data = np.array(data)
を1行で書き換えたものである。
- chunk[k-1]が、fortranで言うところのレコード番号kのデータに対応している。なので、例えばレコード番号6のデータだけを取り出したい場合には、最終行を
```Python
data = chunk[5]['data']
に置き換えれば良い。