バイナリファイル
バイナリファイルとしての保存にはnp.save()、その読み込みにはnp.load()を使う。基本的なオプションは以下の通り。
numpy.save("ファイル名", 配列)
配列 = numpy.load("ファイル名")
注意点として、ファイルの拡張子は.npy
固定。
- saveのファイル名に拡張子をつけない場合、自動的に拡張子
.npy
が付加される - saveのファイル名に別の拡張子を書いても、その後ろに
.npy
が付加される - loadのファイル名の拡張子は
.npy
でなければならない(違う場合はFileNotFoundError)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import numpy as np a1 = np.array([0, 1, 2, 3]) a2 = np.array([[0, 1, 2], [3, 4, 5]]) np.save("bin-1d", a1) np.save("bin-2d", a2) b1 = np.load("bin-1d.npy") b2 = np.load("bin-2d.npy") print(b1) print(b2) # [0 1 2 3] # [[0 1 2] # [3 4 5]] |
テキストファイル
概要
テキストファイルとしての保存にはnp.savetxt()、その読み込みにはnp.loadtxt()を使う。扱える配列の次元は1次元か2次元のみ。基本的なオプションは以下の通り。
numpy.savetxt(
fname, # ファイル名を任意の拡張子まで指定
X, # 書き込む配列
fmt='%.18e', # 書き込む書式
delimiter=' ', # 行内の数値の区切り
newline='n', # 改行文字
header='', # ヘッダー文字列
footer='', # フッター文字列
comments='# ', # コメントの開始文字
encoding=None # エンコーディング
)
numpy.loadtxt(
fname, # ファイル名(拡張子まで)
dtype=<class 'float'>, # データの型
comments='#', # コメント開始文字
delimiter=None, # 区切り文字(デフォルトはスペース)
converters=None,
skiprows=0, # ファイル先頭から指定した行数だけ読み飛ばす
usecols=None, # タプルで指定した列のみ読み込み
unpack=False,
ndmin=0,
encoding='bytes', max_rows=None)
なお、numpy.ndarrayはすべての要素の型が同じでなければならず、リストやタプルのように要素の型を混在させることはできない。
数値データ
数値データのみを扱う場合、整数でも自動的に実数型に変換されて読み込まれる。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import numpy as np a1 = np.array([0, 1, 2, 3]) a2 = np.array([[0, 1, 2], [3, 4, 5]]) np.savetxt("bin-1d.txt", a1) np.savetxt("bin-2d.txt", a2) b1 = np.loadtxt("bin-1d.txt") b2 = np.loadtxt("bin-2d.txt") print(b1) print(b2) # [0. 1. 2. 3.] # [[0. 1. 2.] # [3. 4. 5.]] |
このときのファイルの内容は以下のようになっている。
1 2 3 4 5 6 7 8 9 |
...\python>type bin-1d.txt 0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 ...\python>type bin-2d.txt 0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 4.000000000000000000e+00 5.000000000000000000e+00 |
3次元以上の配列を書き込もうとするとエラー。
1 2 3 |
File "C:...\Python\Python37-32\lib\site-packages\numpy\lib\npyio.py", line 1382, in savetxt "Expected 1D or 2D array, got %dD array instead" % X.ndim) ValueError: Expected 1D or 2D array, got 3D array instead |
文字列
文字列データについては、書き込む場合はfmt="%s"
、読み込む場合にはdtype="unicode"
を指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import numpy as np a3 = np.array(['北海道', '本州', '四国', '九州']) print(a3) np.savetxt("text.txt", a3, fmt="%s") b3 = np.loadtxt("text.txt", dtype="unicode") print(b3) # ['北海道' '本州' '四国' '九州'] # ['北海道' '本州' '四国' '九州'] |
このとき、text.txtファイルの中は以下のようになっている。
1 2 3 4 |
北海道 本州 四国 九州 |
CSVファイルの読み込み
以下のようなCSVファイルを配列に読み込む。
1 2 3 4 5 6 |
,店舗数,国調人口 ,2016,2015 北海道,2906,5381733 青森県,573,1308265 岩手県,523,1279594 ・・・・・ |
numpy.array
はすべての要素の型が同じである必要があるため、上記のように文字列と数値が混在したファイルを一つの配列に読み込もうとするとエラーになる。
1 2 3 |
data = np.loadtxt('conv-pop.csv', delimiter=',', skiprows=2) # ValueError: could not convert string to float: '北海道' |
都道府県名と2次元のデータを別々に読み込むことは可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
title = np.loadtxt( 'conv-pop.csv', dtype='unicode', delimiter=',', skiprows=2, usecols=(0)) data = np.loadtxt('conv-pop.csv', delimiter=',', skiprows=2, usecols=(1,2)) print(title) print(data) # ['北海道' '青森県' '岩手県' '宮城県' '秋田県' '山形県' '福島県' '茨城県' '栃木県' '群馬県' '埼玉県' '千葉県' # '東京都' '神奈川県' '新潟県' '富山県' '石川県' '福井県' '山梨県' '長野県' '岐阜県' '静岡県' '愛知県' '三重県' # '滋賀県' '京都府' '大阪府' '兵庫県' '奈良県' '和歌山県' '鳥取県' '島根県' '岡山県' '広島県' '山口県' '徳島県' # '香川県' '愛媛県' '高知県' '福岡県' '佐賀県' '長崎県' '熊本県' '大分県' '宮崎県' '鹿児島県' '沖縄県'] # [[2.9060000e+03 5.3817330e+06] # [5.7300000e+02 1.3082650e+06] # [5.2300000e+02 1.2795940e+06] ・・・・・ |
読み込み時にUnicodeエラーが出た場合
ファイル読み込み時に以下のようなエラーが出た場合。
1 |
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence |
引数にencoding='utf8'
を指定して回避。
その他のメソッド
- savez()/load()
- 複数のファイルを非圧縮で扱う。
- savez_compressed()/load()
- 複数のファイルを圧縮して扱う
- ndarray.tofile()
- 配列のストレージへの書き込み。