python的concatenate_python – 是否可以np.concatenate内存映射文件?

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

是否有可能将它们全部作为内存映射文件加载,然后连接并切换所有这些文件而不将任何内容加载到内存中?

解决方法:

使用numpy.concatenate显然将数组加载到内存中.为避免这种情况,您可以在新文件中轻松创建第三个memmap数组,并从要连接的数组中读取值.以更有效的方式,您还可以将新数组附加到磁盘上现有的文件中.

对于任何情况,您必须为数组选择正确的顺序(行主要或列主要).

以下示例说明了如何沿轴0和轴1连接.

1)沿轴= 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

沿轴= 0连接不需要传递order =’C’,因为这已经是默认顺序.

2)沿轴= 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

保存在磁盘上的数组实际上是扁平化的,因此如果使用mode = r和shape =(5000,4000)创建c而不更改数组顺序,则a中第二行的1000个第一个元素将转到第一行C.但你可以很容易地避免这个传递order =’F'(列主要)到memmap:

c = np.memmap('a.array', dtype='float64', mode='r+',shape=(5000,4000), order='F')

c[:, 3000:] = b

这里有一个带有连接结果的更新文件’a.array’.您可以重复此过程以成对的方式连接两个.

相关问题:

标签:memory-mapped-files,python,arrays,numpy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值