4

形状を知らずに をロードしてnumpy.memmapも、データの形状を回復することは可能ですか?

data = np.arange(12, dtype='float32')
data.resize((3,4))
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
fp[:] = data[:]
del fp
newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))

最後の行では、 shape を指定せずに、変数newfpが shape を持つ(3,4)ようにしたいと考えていjoblib.loadます。これは可能ですか?ありがとう。

4

3 に答える 3

11

その情報がファイルのどこかに明示的に保存されていない限り、そうではありません。関係する限りnp.memmap、ファイルは単なるフラット バッファーです。

numpy 配列を永続化するために使用することをお勧めしnp.saveます。これにより、ディメンションや dtype などを指定するメタデータも保持されるためです。パラメーターを に.npy渡すことで、ファイルを memmap としてロードすることもできます。memmap_mode=np.load

joblib.dumpピクルス化の組み合わせを使用して、一般的な Python オブジェクトnp.saveを格納し、numpy 配列を格納します。


ファイルに裏打ちされた空のメモリマップ配列を初期化するには、.npy次を使用できますnumpy.lib.format.open_memmap

import numpy as np
from numpy.lib.format import open_memmap

# initialize an empty 10TB memory-mapped array
x = open_memmap('/tmp/bigarray.npy', mode='w+', dtype=np.ubyte, shape=(10**13,))

アレイが利用可能なディスク容量の合計よりも大きい場合でも、これが成功するという事実に驚くかもしれません(私のラップトップには 500GB SSD しかありませんが、10TB の memmap を作成しただけです)。これは、作成されるファイルがsparseであるため可能です。

発見のクレジットは、 kiyo の以前の回答 hereopen_memmapに移動する必要があります。

于 2016-04-20T16:26:11.773 に答える
1

@ali_m からの回答は完全に有効です。それが誰かの助けになる場合に備えて、私の個人的な好みについて言及したいと思います。memmap 配列は常に最初の 2 つの要素として shape から始めます。これを行うのは次のように簡単です。

# Writing the memmap array
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
fp[:] = data[:]
fp = np.memmap(filename, dtype='float32', mode='r+', shape=(14,))
fp[2:] = fp[:-2]
fp[:2] = [3, 4]
del fp

またはさらに簡単に:

# Writing the memmap array
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(14,))
fp[2:] = data[:]
fp[:2] = [3, 4]
del fp

次に、配列を次のように簡単に読み取ることができます。

#reading the memmap array
newfp = np.memmap(filename, dtype='float32', mode='r')
row_size, col_size = newfp[0:2]
newfp = newfp[2:].reshape((row_size, col_size))
于 2016-07-28T15:47:11.487 に答える