无需平铺的高效水平串联方式

我有两个(大)数组。出于说明目的,我使用下面的一个简单示例:


In [14]: arr1 = np.arange(32*512).reshape(32, 512)

In [15]: arr2 = np.arange(512).reshape(1, 512)

我想对这些数组进行水平串联(即沿轴 1 串联)。我想出了以下方法来实现这一目标:


In [16]: np.hstack([arr1, np.tile(arr2, (arr1.shape[0], 1))]).shape

Out[16]: (32, 1024)

这按预期工作。但是,我想知道是否还有其他有效的方法可以在不使用numpy.tile. 恐怕我会炸毁我的内存需求,因为数组真的很大。


如果可以避免这种重复的行(以匹配 的维度arr1),也许使用广播,那就太好了!


PS之所以要避免这种复制,是因为内存需求的线性增长:


In [20]: arr2.nbytes

Out[20]: 4096


In [19]: np.tile(arr2, (arr1.shape[0], 1)).nbytes

Out[19]: 131072


In [22]: arr1.shape[0] * arr2.nbytes

Out[22]: 131072


茅侃侃
浏览 138回答 1
1回答

繁星淼淼

您可以预先分配和使用广播,但它不会节省太多(我预计峰值内存使用量会下降大约四分之一):arr1 = np.arange(32*512).reshape(32, 512)arr2 = np.arange(512).reshape(1, 512)out = np.empty((32, 1024), arr1.dtype)out[:, :512] = arr1out[:, 512:] = arr2out#array([[    0,     1,     2, ...,   509,   510,   511],#       [  512,   513,   514, ...,   509,   510,   511],#       [ 1024,  1025,  1026, ...,   509,   510,   511],#       ...,#       [14848, 14849, 14850, ...,   509,   510,   511],#       [15360, 15361, 15362, ...,   509,   510,   511],#       [15872, 15873, 15874, ...,   509,   510,   511]])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python