为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2021-12-09 15:39:27
我有两个(大)数组。出于说明目的,我使用下面的一个简单示例: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))]).shapeOut[16]: (32, 1024)这按预期工作。但是,我想知道是否还有其他有效的方法可以在不使用numpy.tile. 恐怕我会炸毁我的内存需求,因为数组真的很大。如果可以避免这种重复的行(以匹配 的维度arr1),也许使用广播,那就太好了!PS之所以要避免这种复制,是因为内存需求的线性增长:In [20]: arr2.nbytesOut[20]: 4096In [19]: np.tile(arr2, (arr1.shape[0], 1)).nbytesOut[19]: 131072In [22]: arr1.shape[0] * arr2.nbytesOut[22]: 131072
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

您可以预先分配和使用广播,但它不会节省太多(我预计峰值内存使用量会下降大约四分之一):


arr1 = np.arange(32*512).reshape(32, 512)

arr2 = np.arange(512).reshape(1, 512)

out = np.empty((32, 1024), arr1.dtype)

out[:, :512] = arr1

out[:, 512:] = arr2

out

#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]])


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信