如何将两个2d numpy数组复制到预分配的数组

彩虹

我有两个大型2d numpy数组,它们具有相同的行数但具有不同的列数。假设arr1的形状为(num_rows1,num_cols1),而arr2的形状为(num_rows1,num_cols2)。

我预分配了一个大小为(num_rows1,num_cols1 + num_cols2)的numpy数组arr12。

将arr1和arr2复制到arr12中以使arr1与arr2串联的最有效方法是什么?

使用这种预分配方法是否比numpy的串联方法更有效?

迪卡卡

标杆管理

我们将跨各种数据集进行基准测试并从中得出结论。

时机

使用benchit软件包(打包在一起的基准测试工具很少;免责声明:我是它的作者)对建议的解决方案进行基准测试。

基准测试代码:

import numpy as np
import benchit

def numpy_concatenate(a, b):
    return np.concatenate((a,b),axis=1)

def numpy_hstack(a, b):
    return np.hstack((a,b))

def preallocate(a, b):
    m,n = a.shape[1], b.shape[1]
    out = np.empty((a.shape[0],m+n), dtype=np.result_type((a.dtype, b.dtype)))
    out[:,:m] = a
    out[:,m:] = b
    return out
    
funcs = [numpy_concatenate, numpy_hstack, preallocate]
R = np.random.rand 

inputs = {n: (R(1000,1000), R(1000,n)) for n in [100, 200, 500, 1000, 200, 5000]}
t = benchit.timings(funcs, inputs, multivar=True,   input_name='Col length of b')
t.plot(logy=False, logx=True, savepath='plot_1000rows.png')

在此处输入图片说明

结论:它们在时间上是可比的。

内存分析

在内存方面,np.hstack应类似于np.concatenate因此,我们将使用其中之一。

让我们使用大型2D数组设置输入数据集。我们将做一些内存基准测试。

设置代码:

# Filename : memprof_npconcat_preallocate.py
import numpy as np
from memory_profiler import profile

@profile(precision=10)
def numpy_concatenate(a, b):
    return np.concatenate((a,b),axis=1)

@profile(precision=10)
def preallocate(a, b):
    m,n = a.shape[1], b.shape[1]
    out = np.empty((a.shape[0],m+n), dtype=np.result_type((a.dtype, b.dtype)))
    out[:,:m] = a
    out[:,m:] = b
    return out

R = np.random.rand
a,b = R(1000,1000), R(1000,1000)

if __name__ == '__main__':
    numpy_concatenate(a, b)

if __name__ == '__main__':
    preallocate(a, b)  

因此,a是1000x1000,与相同b

跑 :

$ python3 -m memory_profiler memprof_npconcat_preallocate.py 
Filename: memprof_npconcat_preallocate.py

Line #    Mem usage    Increment   Line Contents
================================================
     9  69.3281250000 MiB  69.3281250000 MiB   @profile(precision=10)
    10                             def numpy_concatenate(a, b):
    11  84.5546875000 MiB  15.2265625000 MiB       return np.concatenate((a,b),axis=1)


Filename: memprof_npconcat_preallocate.py

Line #    Mem usage    Increment   Line Contents
================================================
    13  69.3554687500 MiB  69.3554687500 MiB   @profile(precision=10)
    14                             def preallocate(a, b):
    15  69.3554687500 MiB   0.0000000000 MiB       m,n = a.shape[1], b.shape[1]
    16  69.3554687500 MiB   0.0000000000 MiB       out = np.empty((a.shape[0],m+n), dtype=np.result_type((a.dtype, b.dtype)))
    17  83.6484375000 MiB  14.2929687500 MiB       out[:,:m] = a
    18  84.4218750000 MiB   0.7734375000 MiB       out[:,m:] = b
    19  84.4218750000 MiB   0.0000000000 MiB       return out

因此,对于preallocatemethod,mem的总消耗为14.2929687500+ 0.7734375000,该消耗略小于15.2265625000

将输入数组的大小都更改为5000x5000,a并且b-

$ python3 -m memory_profiler memprof_npconcat_preallocate.py
Filename: memprof_npconcat_preallocate.py

Line #    Mem usage    Increment   Line Contents
================================================
     9 435.4101562500 MiB 435.4101562500 MiB   @profile(precision=10)
    10                             def numpy_concatenate(a, b):
    11 816.8515625000 MiB 381.4414062500 MiB       return np.concatenate((a,b),axis=1)


Filename: memprof_npconcat_preallocate.py

Line #    Mem usage    Increment   Line Contents
================================================
    13 435.5351562500 MiB 435.5351562500 MiB   @profile(precision=10)
    14                             def preallocate(a, b):
    15 435.5351562500 MiB   0.0000000000 MiB       m,n = a.shape[1], b.shape[1]
    16 435.5351562500 MiB   0.0000000000 MiB       out = np.empty((a.shape[0],m+n), dtype=np.result_type((a.dtype, b.dtype)))
    17 780.3203125000 MiB 344.7851562500 MiB       out[:,:m] = a
    18 816.9296875000 MiB  36.6093750000 MiB       out[:,m:] = b
    19 816.9296875000 MiB   0.0000000000 MiB       return out

同样,预分配的总数较少。

结论:预分配方法具有更好的内存优势,这在某种程度上是有意义的。使用串联时,我们有三个涉及src1 + src2-> dst的数组,而使用预分配时,只有src和dst具有较少的内存拥塞,尽管分两个步骤。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Numpy数组复制到memoryview

来自分类Dev

将2D数组复制到3D数组-Python / NumPy

来自分类Dev

javascript:如何将两个1D数组转换为2D数组

来自分类Dev

如何将一个2d数组的内容复制到另一个?(VBA)

来自分类Dev

如何将两个数组组合成一个2D数组?

来自分类Dev

将2D数组复制到函数外部的动态分配2D数组

来自分类Dev

Python:如何将 2D 列表中项目的索引分配给两个整数变量?

来自分类Dev

我应该预分配一个numpy数组吗?

来自分类Dev

Visual C#如何将两个1D string []数组合并为一个2D string [,]数组

来自分类Dev

如何将值从数组复制到新数组?

来自分类常见问题

从两个多维numpy数组复制到另一个具有不同形状的数组

来自分类Dev

将Python中的字节从Numpy数组复制到字符串或字节数组

来自分类Dev

将2d字符数组复制到另一个2d字符数组

来自分类Dev

将argv复制到新数组

来自分类Dev

Java将数组复制到自身

来自分类Dev

将json从对象复制到数组?

来自分类Dev

将值从sortedset复制到数组

来自分类Dev

将向量复制到数组?

来自分类Dev

将json从对象复制到数组?

来自分类Dev

将 shell 输出复制到数组

来自分类Dev

如何使用numpy从两个1D数组生成布尔2D数组

来自分类常见问题

将字符串复制到内存分配的数组时出现分段错误

来自分类Dev

将十进制复制到字节数组中而不进行分配

来自分类Dev

将十进制复制到字节数组中而不分配

来自分类Dev

将字符串复制到内存分配的数组时出现分段错误

来自分类Dev

如何将数组的内容复制到变量

来自分类Dev

如何将2d数组复制到临时2d数组中并返回它?

来自分类Dev

如何将数组值复制到另一个数组

来自分类Dev

如何将两个numpy数组相加?

Related 相关文章

热门标签

归档