Python入門トップページ


目次

  1. NumPy とは
  2. Python リストの場合
  3. NumPy の使用例
    1. 1次元配列(ベクトル)
    2. 2次元配列(行列)
    3. 要素の取り出し
    4. ベクトルと行列の変換
    5. NumPy のデータ型
    6. NumPy 配列の作成と操作
    7. ユニバーサル関数と集約関数
    8. NumPy 配列のソート
    9. NumPy の構造化配列
    10. NumPy 配列の保存と読み込み
  4. NumPy で線形代数
  5. NumPy の乱数生成

NumPy

NumPy の使用例

NumPy 配列の保存と読み込み

NumPy 配列をそのままのバイナリ形式でファイルに保存することができます.ひとつのベクトル形式や行列形式の配列は np.save() を使って拡張子が .npy のファイルに保存します.複数の配列をまとめて保存するには,np.savez() を使い,このときは拡張子が .npz になります.ファイルを読み込むときにはその形式に関わらず np.load() を使います. なお,CSVファイル等の形式で保存するのであれば Pandas を使う方法もあります.

目次に戻る

配列の保存と読み込み

まず,1次元配列 w を定義して,ファイル名「w.npy」で保存します.

w = np.array([50, 60, 70, 80, 90, 100])
print(w)
np.save("w.npy", w)
[ 50  60  70  80  90 100]

保存したデータを読み込んで w1 に格納します.全く同じ形式で読み込めていることがわかりました.

w1 = np.load("w.npy")
print(w1)
[ 50  60  70  80  90 100]

行列形式の2次元配列も同様です.行列 x を定義してファイル名「x.npy」で保存します.

x = np.array([
    [0, 1, 0, 0, 1, 1],
    [0, 1, 1, 1, 0, 0],
    [1, 1, 0, 0, 0, 0],
    [0, 1, 1, 1, 0, 1]
])
print(x)
np.save("x.npy", x)
[[0 1 0 0 1 1]
 [0 1 1 1 0 0]
 [1 1 0 0 0 0]
 [0 1 1 1 0 1]]

読み込む方法もベクトルデータの場合と全く同じです.

x1 = np.load("x.npy")
print(x1)
[[0 1 0 0 1 1]
 [0 1 1 1 0 0]
 [1 1 0 0 0 0]
 [0 1 1 1 0 1]]

複合データ型を用いた構造化配列であっても同じように保存することができます.

tp = np.dtype([('id', 'u4'), ('name', 'U10'), ('score', 'i8', 4), ('total', 'i8')])
Z = np.zeros(3, dtype=tp)

Z['id'] = np.array([101, 102, 103])
Z['name'] = ['Tanaka', 'Sato', 'Abe']
Z['score'] = np.array([
    [30, 60, 55, 40],
    [25, 70, 20, 60],
    [45, 55, 60, 50]
    ])
Z['total'] = np.sum(Z['score'], axis=1)

np.save("z.npy", Z)
Z
array([(101, 'Tanaka', [30, 60, 55, 40], 185),
       (102, 'Sato', [25, 70, 20, 60], 175),
       (103, 'Abe', [45, 55, 60, 50], 210)],
      dtype=[('id', '<u4'), ('name', '<U10'), ('score', '<i8', (4,)), ('total', '<i8')])

構造化配列も読み込みが可能で,データ型の定義も読み込みできていることがわかります.

z1 = np.load("z.npy")
z1
array([(101, 'Tanaka', [30, 60, 55, 40], 185),
       (102, 'Sato', [25, 70, 20, 60], 175),
       (103, 'Abe', [45, 55, 60, 50], 210)],
      dtype=[('id', '<u4'), ('name', '<U10'), ('score', '<i8', (4,)), ('total', '<i8')])

目次に戻る

複数の配列をまとめた保存と読み込み

複数の配列を一つのファイルに纏めて保存することもできます.このときには savez() を用い,保存されるファイル名の拡張子には「.npz」を指定します.

例えば,ベクトル w と行列 x を定義して一つのファイルにまとめて保存します.

w = np.array([50, 60, 70, 80, 90, 100])
x = np.array([
    [0, 1, 0, 0, 1, 1],
    [0, 1, 1, 1, 0, 0],
    [1, 1, 0, 0, 0, 0],
    [0, 1, 1, 1, 0, 1]
])
print(w)
print(x)

np.savez('wx.npz', w, x)
[ 50  60  70  80  90 100]
[[0 1 0 0 1 1]
 [0 1 1 1 0 0]
 [1 1 0 0 0 0]
 [0 1 1 1 0 1]]

読み込みには配列の場合と同じ np.load() を使います.

wx = np.load('wx.npz')

print() ではオブジェクト ID が表示されることになります.

print(wx)
<numpy.lib.npyio.NpzFile object at 0x7fe6e8583550>

保存するときに名前を指定していないので,files で名前の一覧を取得すると arr_0, arr_1 のような連番になります.

print(wx.files)
['arr_0', 'arr_1']

名前でアクセスして次のように配列を取り出すことができます.

w1 = wx['arr_0']
print(w1)
[ 50  60  70  80  90 100]

x1 = wx['arr_1']
print(x1)
[[0 1 0 0 1 1]
 [0 1 1 1 0 0]
 [1 1 0 0 0 0]
 [0 1 1 1 0 1]]

上の例では名前が連番になっていてわかりにくいかもしれません.保存するときに名前を指定することも可能です.

np.savez('wx_name.npz', weight=w, x=x)

名前を指定して保存したファイルを読み込みます.

wx_name = np.load('wx_name.npz')

名前の一覧を確認します.

wx_name.files
['weight', 'x']

次のように名前を指定してアクセスできると使いやすいでしょう.

w = wx_name['weight']
print(w)
[ 50  60  70  80  90 100]
x = wx_name['x']
print(x)
[[0 1 0 0 1 1]
 [0 1 1 1 0 0]
 [1 1 0 0 0 0]
 [0 1 1 1 0 1]]

目次に戻る