我正在处理一个python任务,该任务需要将张量展开为不同的模式并计算其协方差矩阵。张量是一大堆具有形状(num-images,h,w)的大图像,大小超过40GB。代码段如下:
# arr is the tensor with size (num-images, h, w)
n = arr.shape[0]
h = arr.shape[1]
w = arr.shape[2]
Xm2 = arr.reshape(h*n, w)
Xm1 = np.swapaxes(arr,1,2)
Xm1 = Xm1.reshape(w*n, h)
SB = Xm1.T.dot(Xm1)
SA = Xm2.T.dot(Xm2)
第一次整形操作花费不到1秒,而最后两个点积花费不到10秒。但是,第二次整形操作可能需要40秒钟以上的时间,这可能是由于不连续的数组所致,因此它需要复制整个数组以使其在随后的操作中是连续的。
我也在NumPy中尝试过tensordot,但是,它似乎仍然需要复制数据。
我想知道是否有更好的方法来加快这项工作(更好的展开方法或在不展开的情况下获得SB,SA)。在此先感谢!