我正在处理大数据,并且我的矩阵大小为2000x100000,所以为了更快地工作,我尝试使用numpy.memmap来避免由于RAM限制而在内存中存储这个大矩阵。问题是,当我将相同的矩阵存储在2个变量中时,即一个用numpy.load,另一个用np.memmap,内容不一样。这是正常的吗?我在memmap中使用与我的数据中相同的数据类型。例如:
A1 = numpy.load('mydata.npy')
A2 = numpy.memmap('mydata.npy',dtype=numpy.float64, mode='r', shape=(2000,2000))
A1[0,0] = 0
A2[0,0] = 1.8758506894003703e-309
在两种情况下都是数组第一个元素的内容。正确的一个是值0但我通过使用memmap得到这个奇怪的数字。 谢谢。
答案 0 :(得分:18)
NPY格式不仅仅是将数组的数据转储到文件中。它包括一个标题,其中包含定义数组数据类型和形状的元数据。当您直接使用memmap
时,您的内存映射不会考虑存储元数据的文件头。要创建NPY文件的内存映射视图,可以使用mmap_mode
的{{1}}选项。
这是一个例子。首先,创建一个NPY文件:
np.load
请使用In [1]: a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
In [2]: np.save('a.npy', a)
:
np.load
使用In [3]: a1 = np.load('a.npy')
In [4]: a1
Out[4]:
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
错误地查看文件:
memmap
使用带有In [5]: a2 = np.memmap('a.npy', dtype=np.float64, mode='r', shape=(2, 3))
In [6]: a2
Out[6]:
memmap([[ 1.87585069e-309, 1.17119999e+171, 5.22741680e-037],
[ 8.44740097e+252, 2.65141232e+180, 9.92152605e+247]])
选项的memmap
创建np.load
:
mmap_mode='r'