4

是否可以在不知道形状的情况下加载 anumpy.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))

在最后一行,我希望能够不指定形状并且仍然让变量newfp具有 shape (3,4),就像它会发生在joblib.load. 这可能吗?谢谢。

4

3 回答 3

11

除非该信息已明确存储在某个文件中,否则不会。就np.memmap目前而言,该文件只是一个平面缓冲区。

我建议使用np.save持久化 numpy 数组,因为这也保留了指定它们的维度、dtypes 等的元数据。您还可以.npy通过将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 内存映射),您可能会惊讶于这会成功。这是可能的,因为创建的文件是sparse

发现的功劳open_memmap应该转到kiyo 以前的答案

于 2016-04-20T16:26:11.773 回答
1

@ali_m的答案是完全有效的。我想提一下我的个人喜好,以防它对任何人有所帮助。我总是以形状作为前 2 个元素来开始我的 memmap 数组。这样做很简单:

# 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 回答
0

一种替代方法numpy.memmaptifffile.memmap

from tifffile import memmap
newArray = memmap("name", shape=(3,3), dtype='uint8')
newArray[1,1] = 11
del(newArray)

newArray创建的文件具有以下值:

0  0  0
0  11 0
0  0  0  

现在让我们读回它:

array = memmap("name", dtype='uint8')
print(array.shape) # prints (3,3)
print(array)

印刷:

0  0  0
0  11 0
0  0  0
于 2019-07-04T07:42:38.777 回答