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
维度大小的关系:
这是一个记忆问题还是numpy的基本特征?
据我所知,numpy,所有stack
和concatenate
功能并不是非常有效.并且有充分的理由,因为numpy试图保持数组内存连续效率(请参阅此链接关于numpy中的连续数组)
这意味着每次连接操作都必须每次都复制整个数据.当我需要将一堆元素连接在一起时,我倾向于这样做:
l = []
for additional_X in ...:
l.append(addiional_X)
xdata_test = np.concatenate(l)
Run Code Online (Sandbox Code Playgroud)
这样,移动整个数据的昂贵操作只进行一次.
注意:对提供给你的速度提升感兴趣.
如果你事先预定了要连接的数组,我建议创建一个具有总形状的新数组,并用小数组填充它而不是连接,因为每个连接操作都需要将整个数据复制到一个新的连续空间记忆.
首先,计算第一轴的总大小:
max_x = 0
for arr in list_of_arrays:
max_x += arr.shape[0]
Run Code Online (Sandbox Code Playgroud)其次,创建最终容器:
final_data = np.empty((max_x,) + xdata_test.shape[1:], dtype=xdata_test.dtype)
Run Code Online (Sandbox Code Playgroud)
这相当于(max_x, 40, 24, 24)
动态类型.
最后,填充numpy数组:
curr_x = 0
for arr in list_of_arrays:
final_data[curr_x:curr_x+arr.shape[0]] = arr
curr_x += arr.shape[0]
Run Code Online (Sandbox Code Playgroud)上面的循环将每个数组复制到较大数组的先前定义的列/行.
通过这样做,每个N
数组将被复制到确切的最终目标,而不是为每个连接创建时间数组.
归档时间: |
|
查看次数: |
882 次 |
最近记录: |