当前位置: 首页 > 面试题库 >

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

皇甫夕
2023-03-14
问题内容

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

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



 类似资料:
  • 读 # mmap_read.py import mmap with open('lorem.txt', 'r') as f: with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m: print('First 10 bytes via read :', m.read(10

  • 本文向大家介绍Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?相关面试题,主要包含被问及Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?时的应答技巧和注意事项,需要的朋友参考一下 不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复; 原因就

  • 问题内容: 最近,我碰到了这篇文章,这篇文章很好地介绍了内存映射文件以及如何在两个进程之间共享它。这是读取文件的过程的代码: 但是,我对这种方法有几点评论/问题: 如果我们仅对空文件执行读取器,即运行 这将分配8000个字节,现在将扩展文件。返回的缓冲区的限制为8000,位置为0,因此,读取器可以继续读取空数据。发生这种情况后,阅读器将停止,如。 现在应该是作家了(代码被省去了,因为它很简单,可以

  • 调用clear方法时,内存似乎减少了。然而,从其他答案来看,似乎< code>clear方法从未收缩过< code>HashMap。那么为什么内存会减少呢?

  • 系统调用在调用进程的虚拟地址空间中提供映射,将文件或设备映射到内存中。 下面是两种类型 - 文件映射或文件支持的映射 - 此映射将进程的虚拟内存区域映射到文件。 这意味着读取或写入这些内存区域会导致文件被读取或写入。这是默认的映射类型。 匿名映射 - 此映射映射进程的虚拟内存区域,不受任何文件的支持。 内容被初始化为零。 这种映射类似于动态内存分配(malloc()),在某些实现中用于某些分配。