在不知道形状的情况下加载 np.memmap
load np.memmap without knowing shape
是否可以在不知道形状的情况下加载 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
一样].这可能吗?谢谢。
除非该信息已明确存储在某处的文件中,否则不会。就 np.memmap
而言,文件只是一个平面缓冲区。
我建议使用 np.save
to persist numpy arrays, since this also preserves the metadata specifying their dimensions, dtypes etc. You can also load an .npy
file as a memmap by passing the memmap_mode=
parameter to np.load
。
joblib.dump
使用 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,))
您可能会对这样的事实感到惊讶 即使阵列大于总可用磁盘 space(我的笔记本电脑只有 500GB SSD,但我刚刚创建了一个 10TB 内存映射)。这是可能的,因为创建的文件是 .
发现 open_memmap
的功劳应归于 kiyo's previous answer here。
来自@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))
numpy.memmap
的替代方法是 tifffile.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
是否可以在不知道形状的情况下加载 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
一样].这可能吗?谢谢。
除非该信息已明确存储在某处的文件中,否则不会。就 np.memmap
而言,文件只是一个平面缓冲区。
我建议使用 np.save
to persist numpy arrays, since this also preserves the metadata specifying their dimensions, dtypes etc. You can also load an .npy
file as a memmap by passing the memmap_mode=
parameter to np.load
。
joblib.dump
使用 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,))
您可能会对这样的事实感到惊讶 即使阵列大于总可用磁盘 space(我的笔记本电脑只有 500GB SSD,但我刚刚创建了一个 10TB 内存映射)。这是可能的,因为创建的文件是
发现 open_memmap
的功劳应归于 kiyo's previous answer here。
来自@ali_m 的
# 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))
numpy.memmap
的替代方法是 tifffile.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