構造体を使用すると、データの配列全体をディスクに非常に簡単にダンプまたは読み取ることができますが、メタデータ、つまり、書き込まれたアイテムの数、各アイテムのサイズ、配列の形状などを保存する方法を理解する必要があります...
たとえば、配列は常に uint32 で構成されているとします。このような配列arr
を指定すると、次のように記述できます。
f = open(filename, 'wb')
f.write(struct.pack('I', arr.ndim))
f.write(struct.pack('I' * arr.ndim, *arr.shape))
size = reduce(lambda x, y: x*y, arr.shape)
f.write(struct.pack('I' * size, *arr.ravel()))
そして、あなたはそれを次のように読むことができます
f = open(filename, 'rb')
ndim = struct.unpack('I', f.read(4))[0]
shape = tuple(struct.unpack('I' * ndim, f.read(4 * ndim)))
size = reduce(lambda x, y: x*y, shape)
arr = np.array(struct.unpack('I' * size, f.read(4 * size)).reshape(shape)
データ型、データのエンディアンをコーディングするためのより複雑なスキームを考え出すことができます...
また、それらがシステムで機能する場合、配列全体の実際のダンプにnumpy.fromfileとnumpy.tofileを使用すると非常に便利です。