我正在使用大数据,并且我有大小像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
Run Code Online (Sandbox Code Playgroud)
这是两种情况下数组第一个元素的内容.正确的一个是值0但我通过使用memmap得到这个奇怪的数字.谢谢.
War*_*ser 18
NPY格式不仅仅是将数组的数据转储到文件中.它包含一个标头,其中包含定义数组数据类型和形状的元数据.memmap直接使用时,您的内存映射不会考虑存储元数据的文件头.要创建NPY文件的内存映射视图,可以使用mmap_mode选项np.load.
这是一个例子.首先,创建一个NPY文件:
In [1]: a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
In [2]: np.save('a.npy', a)
Run Code Online (Sandbox Code Playgroud)
请阅读np.load:
In [3]: a1 = np.load('a.npy')
In [4]: a1
Out[4]:
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
Run Code Online (Sandbox Code Playgroud)
使用以下方法错误地查看文件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]])
Run Code Online (Sandbox Code Playgroud)
memmap使用np.load选项创建一个使用mmap_mode='r':
In [7]: a3 = np.load('a.npy', mmap_mode='r')
In [8]: a3
Out[8]:
memmap([[ 1., 2., 3.],
[ 4., 5., 6.]])
Run Code Online (Sandbox Code Playgroud)