是否可以np.concatenate内存映射文件?
我用np.save()保存了几个numpy数组,并将它们放在一起非常大。
是否可以将它们全部加载为内存映射文件,然后对它们进行串联和切片,而无需将任何内容都加载到内存中?
-
使用
numpy.concatenate
显然将数组加载到内存中。为避免这种情况,您可以轻松地memmap
在新文件中创建一个thrid数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列追加到磁盘上已存在的文件中。在任何情况下,您都必须为数组选择正确的顺序(行主或列主)。
以下示例说明了如何沿轴0和轴1连接。
1)沿着
axis=0
a = np.memmap('a.array', dtype='float64', mode='w+', shape=( 5000,1000)) # 38.1MB a[:,:] = 111 b = np.memmap('b.array', dtype='float64', mode='w+', shape=(15000,1000)) # 114 MB b[:,:] = 222
您可以定义第三个数组,该第三个数组
a
在模式r+
(读取和追加)下读取与要连接的第一个数组(此处为)相同的文件,但是具有要在连接后实现的最终数组的形状,例如:c = np.memmap('a.array', dtype='float64', mode='r+', shape=(20000,1000), order='C') c[5000:,:] = b
串联
axis=0
不需要通过,order='C'
因为这已经是默认顺序。
2)沿着
axis=1
a = np.memmap('a.array', dtype='float64', mode='w+', shape=(5000,3000)) # 114 MB a[:,:] = 111 b = np.memmap('b.array', dtype='float64', mode='w+', shape=(5000,1000)) # 38.1MB b[:,:] = 222
保存在磁盘阵列实际上是扁平的,所以如果你创建
c
与mode=r+
和shape=(5000,4000)
不改变排列顺序,1000
从第二行第一个元素a
会去先在行c
。但是,您可以轻松避免将此order='F'
(主要列)传递给memmap
:c = np.memmap('a.array', dtype='float64', mode='r+',shape=(5000,4000), order='F') c[:, 3000:] = b
在这里,您具有带有连接结果的更新文件’a.array’。您可以重复此过程以成对连接两个。