0

次の例を検討してください。

import numpy as np
a = np.array(1)
np.save("a.npy", a)

a = np.load("a.npy", mmap_mode='r')
print(type(a))

b = a + 2
print(type(b))

出力する

<class 'numpy.core.memmap.memmap'>
<class 'numpy.int32'>

したがって、これはもはや でbはないようです。これにより、全体を読み取る必要があり、memmap の目的が無効になると思います。したがって、私の質問は、アクセス時間まで操作を延期できますか?memmapnumpya.npymemmaps

ndarrayサブクラス化またはサブクラス化がうまくいくと信じてmemmapいますが、それを試すほどの Python スキルに自信がありません。

これは私の問題を示す拡張された例です:

import numpy as np

# create 8 GB file
# np.save("memmap.npy", np.empty([1000000000]))

# I want to print the first value using f and memmaps


def f(value):
    print(value[1])


# this is fast: f receives a memmap
a = np.load("memmap.npy", mmap_mode='r')
print("a = ")
f(a)

# this is slow: b has to be read completely; converted into an array
b = np.load("memmap.npy", mmap_mode='r')
print("b + 1 = ")
f(b + 1)
4

2 に答える 2

1

これがpythonの仕組みです。デフォルトでは、numpy 操作は新しい配列を返すためb、memmap として存在することはありません。 +on が呼び出されたときに作成されaます。

これを回避するには、いくつかの方法があります。最も簡単なのは、すべての操作をその場で行うことです。

a += 1

これには、読み取りと書き込みのためにメモリ マップド アレイをロードする必要があります。

a = np.load("a.npy", mmap_mode='r+')

もちろん、元の配列を上書きしたくない場合、これは役に立ちません。
この場合、bmemmap する必要があることを指定する必要があります。

b = np.memmap("b.npy", mmap+mode='w+', dtype=a.dtype, shape=a.shape)

割り当ては、numpy ufuncs によって提供されるoutキーワードを使用して行うことができます。

np.add(a, 2, out=b)
于 2018-08-31T14:57:11.357 に答える