NumPy配列をファイルに書き込むならコレ!lib.format.write_arrayの使い方と便利な代替方法


numpy.lib.format.write_array(fp, array, version=None, allow_pickle=True, pickle_kwargs=None)

引数

  • pickle_kwargs: allow_pickleTrue の場合、ピクル化に使用されるオプションを指定します。
  • allow_pickle: ピクル形式のデータを含む配列を保存するかどうかを指定します。デフォルトは True です。
  • version: ファイル形式のバージョン番号。デフォルトは None で、最新バージョンが使用されます。
  • array: 保存する NumPy 配列。
  • fp: ファイルオブジェクトまたはファイルパス。書き込み先のファイルを開く必要があります。

戻り値

なし

詳細

  1. データ書き込み: 次に、配列のデータ本体が書き込まれます。データは、C 形式または Fortran 形式で保存できます。
  2. オプション: allow_pickle オプションを True に設定すると、ピクル形式のデータを含む配列を保存できます。ピクル化により、複雑なオブジェクトをバイナリ形式で保存できますが、ファイル形式の互換性が低下する可能性があります。

import numpy as np

# サンプル配列を作成
arr = np.array([[1, 2, 3], [4, 5, 6]])

# ファイルに書き込む
with open('data.npy', 'wb') as f:
    np.lib.format.write_array(f, arr)

# 読み込み
with open('data.npy', 'rb') as f:
    loaded_arr = np.lib.format.read_array(f)

print(loaded_arr)

この例では、arr 配列が data.npy ファイルに書き込まれ、その後読み込まれて元の配列と同じであることが確認されます。

  • 圧縮された .npz ファイル形式で配列を保存するには、numpy.savez() 関数を使用できます。
  • lib.format.write_array() 関数は、メモリマップされた配列を直接書き込むこともできます。


ピクル形式のデータを含む配列の保存

この例では、allow_pickle オプションを使用して、ピクル形式のデータを含む配列を保存する方法を示します。

import numpy as np

# サンプル配列を作成
data = {'a': 1, 'b': np.array([2, 3, 4])}
arr = np.array(data)

# ファイルに書き込む
with open('data.npy', 'wb') as f:
    np.lib.format.write_array(f, arr, allow_pickle=True)

# 読み込み
with open('data.npy', 'rb') as f:
    loaded_arr = np.lib.format.read_array(f)

print(loaded_arr)

このコードを実行すると、data 配列が data.npy ファイルに保存され、その後読み込まれて元の配列と同じであることが確認されます。ピクル化されたデータは loaded_arr['b'] としてアクセスできます。

メモリマップされた配列の書き込み

この例では、lib.format.write_array() 関数を使用してメモリマップされた配列を直接書き込む方法を示します。

import numpy as np
import os

# サンプル配列を作成
arr = np.arange(1000000)

# メモリマップされた配列を作成
data = np.lib.format.mmap(arr.dtype, arr.shape, 'w+', filename='data.npy')

# データを書き込む
data[:] = arr

# メモリマップを閉じる
data.close()

# ファイルサイズを確認
print(os.path.getsize('data.npy'))

このコードを実行すると、arr 配列が data.npy ファイルにメモリマップされた形式で書き込まれます。ファイルサイズは約 8 MB であることが確認できます。

この例では、numpy.savez() 関数を使用して圧縮された .npz ファイルに配列を保存する方法を示します。

import numpy as np

# サンプル配列を作成
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

# 保存
np.savez('data.npz', arr1=arr1, arr2=arr2)

# 読み込み
with np.load('data.npz') as f:
    loaded_arr1 = f['arr1']
    loaded_arr2 = f['arr2']

print(loaded_arr1, loaded_arr2)

このコードを実行すると、arr1arr2 配列が data.npz ファイルに圧縮されて保存されます。その後、配列は loaded_arr1loaded_arr2 として読み込まれます。



numpy.save() 関数

numpy.save() 関数は、配列を .npz ファイル形式で保存するために使用されます。.npz ファイルは圧縮されており、.npy ファイルよりもディスク容量を節約できます。また、numpy.save() 関数は、複数の配列を単一のファイルに保存するのに役立ちます。

利点

  • 複数の配列を単一のファイルに保存できる
  • 圧縮によりディスク容量を節約できる

欠点

  • すべてのシステムで .npz ファイル形式がサポートされているわけではない
  • .npy ファイルよりも読み書きが遅い場合がある


import numpy as np

# サンプル配列を作成
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

# 保存
np.save('data.npz', arr1=arr1, arr2=arr2)

NumPy 配列を保存するために使用できる他のファイル形式もいくつかあります。たとえば、CSV 形式、テキスト形式、HDF5 形式などがあります。これらの形式は、それぞれ異なる利点と欠点があります。

利点

  • 他のツールやライブラリとの互換性がある場合がある
  • 特定のニーズに適した形式を選択できる

欠点

  • すべての形式がすべてのシステムでサポートされているわけではない
  • NumPy 固有の形式ではないため、読み書きがより複雑になる場合がある


import numpy as np

# サンプル配列を作成
arr = np.array([1, 2, 3])

# CSV 形式で保存
np.savetxt('data.csv', arr, delimiter=',')

# テキスト形式で保存
with open('data.txt', 'w') as f:
    for row in arr:
        np.savetxt(f, row, delimiter=' ')

# HDF5 形式で保存
import h5py

with h5py.File('data.h5', 'w') as f:
    f.create_dataset('data', data=arr)

カスタム書き込みロジック

独自の要件がある場合は、カスタム書き込みロジックを実装することもできます。これにより、完全な制御と柔軟性を備えた保存方法を作成できます。

利点

  • 特定のニーズに合わせた保存方法を作成できる
  • 完全な制御と柔軟性

欠点

  • NumPy 固有の形式ではないため、読み書きがより複雑になる場合がある
  • 実装とテストがより複雑になる
import numpy as np

# サンプル配列を作成
arr = np.array([1, 2, 3])

# カスタム書き込みロジック
with open('data.bin', 'wb') as f:
    f.write(arr.tobytes())

# 読み込み
with open('data.bin', 'rb') as f:
    data = f.read()
    loaded_arr = np.frombuffer(data, dtype=np.float64)

print(loaded_arr)