装载np.memmap公司不知道形状

2024-09-30 14:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在最后一行中,我希望能够不指定形状,但仍然获得变量newfp,使其具有形状(3,4),就像使用joblib.load时一样。这可能吗?谢谢。在


Tags: 数据numpydatamodenp情况filename形状
3条回答

numpy.memmap的另一种选择是tifffile.memmap

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

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

^{pr2}$

现在让我们回顾一下:

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

印刷品:

0  0  0
0  11 0
0  0  0

@ali\m中的answer完全有效。我想谈谈我个人的喜好,以防对任何人有帮助。我总是以形状作为前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

或者更简单:

^{pr2}$

然后可以很容易地将数组读入:

#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))

除非该信息被显式地存储在文件的某个地方。就^{}而言,该文件只是一个平面缓冲区。在

我建议使用^{}来持久化numpy数组,因为这也保留了指定其维度、数据类型等的元数据。您还可以通过将memmap_mode=参数传递给^{}来将.npy文件加载为memmap。在

^{}结合使用pickling来存储泛型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。在

发现open_memmap的功劳应归于kiyo's previous answer here。在

相关问题 更多 >