是否可以np.concatenate内存映射文件?

发布于 2021-01-29 17:41:49

我用np.save()保存了几个numpy数组,并将它们放在一起非常大。

是否可以将它们全部加载为内存映射文件,然后对它们进行串联和切片,而无需将任何内容都加载到内存中?

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用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
    

    保存在磁盘阵列实际上是扁平的,所以如果你创建cmode=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’。您可以重复此过程以成对连接两个。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看