numpy数组大小与连接速度

MJ.*_*hin 5 python performance numpy

我将数据连接到一个像这样的numpy数组:

xdata_test = np.concatenate((xdata_test,additional_X))
Run Code Online (Sandbox Code Playgroud)

这已经完成了一千次.数组有dtype float32,它们的大小如下所示:

xdata_test.shape   :  (x1,40,24,24)        (x1 : [500~10500])   
additional_X.shape :  (x2,40,24,24)        (x2 : [0 ~ 500])
Run Code Online (Sandbox Code Playgroud)

问题是当x1大于~2000-3000时,连接需要更长的时间.

下图显示了连接时间与x2维度大小的关系:

x2与时间消耗

这是一个记忆问题还是numpy的基本特征?

Ben*_*uin 6

据我所知,numpy,所有stackconcatenate功能并不是非常有效.并且有充分的理由,因为numpy试图保持数组内存连续效率(请参阅此链接关于numpy中的连续数组)

这意味着每次连接操作都必须每次都复制整个数据.当我需要将一堆元素连接在一起时,我倾向于这样做:

l = []
for additional_X in ...:
    l.append(addiional_X)
xdata_test = np.concatenate(l)
Run Code Online (Sandbox Code Playgroud)

这样,移动整个数据的昂贵操作只进行一次.

注意:对提供给你的速度提升感兴趣.


Ima*_*ngo 5

如果你事先预定了要连接的数组,我建议创建一个具有总形状的新数组,并用小数组填充它而不是连接,因为每个连接操作都需要将整个数据复制到一个新的连续空间记忆.

上面的循环将每个数组复制到较大数组的先前定义的列/行.

通过这样做,每个N数组将被复制到确切的最终目标,而不是为每个连接创建时间数组.