ファイル入出力
1. 学習内容
- ❶
.npyファイルの保存と読み込み(単一配列) - ❷
.npzファイルの保存と読み込み(複数の配列) - ❸
loadtxtおよびsavetxtによる CSV/テキストファイルの入出力 - ❹ 大規模データセット向けのメモリマッピング配列
2. 主要な概念
(1) .npy 形式
PYTHON
import numpy as np
a = np.array([1, 2, 3, 4, 5])
# Save
np.save('array.npy', a)
# Load
b = np.load('array.npy')
print(b) # [1 2 3 4 5]
(2) .npz 形式(複数の配列)
PYTHON
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
# Save multiple arrays
np.savez('data.npz', x=x, y=y)
# Load
data = np.load('data.npz')
print(data['x']) # [1 2 3]
print(data['y']) # [4 5 6]
(3) CSV/テキストファイル
PYTHON
# Save to CSV
data = np.array([[1, 2, 3],
[4, 5, 6]])
np.savetxt('data.csv', data, delimiter=',', fmt='%.2f')
# Load from CSV
loaded = np.loadtxt('data.csv', delimiter=',')
(1) ▶ サンプル:.npy ファイルの保存と読み込み(難易度 ⭐)
PYTHON
import numpy as np
import os
# Create and save an array
a = np.array([1, 2, 3, 4, 5])
np.save('example.npy', a)
# Load it back
b = np.load('example.npy')
print("Loaded:", b)
print("Same data:", np.array_equal(a, b))
# Clean up
os.remove('example.npy')
出力:
TEXT読み込み中:[1 2 3 4 5] 同じデータ:True
(2) ▶ サンプル:CSVファイルの入出力(難易度 ⭐⭐)
PYTHON
import numpy as np
import os
data = np.array([[1.5, 2.3, 3.7],
[4.1, 5.6, 6.2],
[7.8, 8.4, 9.9]])
# Save to CSV
np.savetxt('data.csv', data, delimiter=',', fmt='%.2f',
header='x,y,z', comments='')
# Load from CSV
loaded = np.loadtxt('data.csv', delimiter=',')
print("Loaded CSV:\n", loaded)
# Load specific columns
col_0 = np.loadtxt('data.csv', delimiter=',', usecols=0)
print("First column:", col_0)
os.remove('data.csv')
出力:
TEXT読み込んだCSV: [[1.5 2.3 3.7] [4.1 5.6 6.2] [7.8 8.4 9.9]] 1列目:[1.5 4.1 7.8]
(3) ▶ サンプル:.npz ファイルの取り扱い(難易度 ⭐⭐)
PYTHON
import numpy as np
import os
x = np.linspace(0, 10, 100)
y = np.sin(x)
z = np.cos(x)
# Save multiple arrays
np.savez('trig.npz', x=x, y=y, z=z)
# Load and access by name
data = np.load('trig.npz')
print("Keys:", list(data.keys()))
print("x[:5]:", data['x'][:5])
print("y[:5]:", data['y'][:5])
os.remove('trig.npz')
出力:
TEXTキー:['x', 'y', 'z'] x[:5]: [0. 0.1010101 0.2020202 0.3030303 0.4040404] y[:5]: [0. 0.10083842 0.20064886 0.2984138 0.3931366]
❓ よくある質問
Q .npy形式のCSV形式に対する利点は何ですか?
A .npy形式はdtypeを正確に保持し、読み書きが高速で、ディスク容量も少なくて済みます。CSV形式は人間が読みやすく移植性にも優れていますが、処理速度が遅く、dtype情報が失われます。
Q メモリマップド配列とは何ですか?
A
np.load('file.npy', mmap_mode='r') はファイルをメモリマップド配列として読み込みます。つまり、ファイル全体を一度にメモリに読み込むわけではありません。RAMの容量を超えるデータセットを扱う際に便利です。Q CSV ファイルの欠損値はどのように処理すればよいですか?
A
np.genfromtxt に filling_values パラメータを指定して、欠損エントリのデフォルト値を指定してください。📖 まとめ
np.save/np.load: .npy 形式の単一配列(高速、コンパクト、データ型を保持)np.savez/np.load: .npz形式(圧縮辞書)の複数の配列np.savetxt/np.loadtxt: CSV/テキストファイルの入出力np.genfromtxt: 欠損値や混合型に対応しています- メモリマッピングされた配列:大規模なデータセットには
mmap_mode='r'を使用
📝 練習問題
-
初心者向け(難易度 ⭐):配列を作成し、.npy および .csv 形式で保存した後、両方を読み込み、読み込まれた値を比較してください。
-
中級(難易度 ⭐⭐):3つの配列を作成し、それらを1つの.npzファイルに保存してから読み込み、各配列が正しく復元されていることを確認してください。
-
上級(難易度 ⭐⭐⭐):大きな配列(1000×1000)を作成し、.npy として保存してから、
mmap_mode='r'を使って読み込んでください。 その配列の1つの要素にアクセスし、大規模なデータセットにおいて、この方法がなぜメモリ効率に優れているかを説明してください。