如何在Numpy中复用数组b的内存重新生成tile数组?
问题解答
如果你的m和n在两次操作中保持不变(即b的形状无需改变),完全可以实现内存复用,不需要重新创建新数组。具体方案如下:
核心思路
np.tile()默认会创建新数组,直接赋值给b会让旧数组被标记为垃圾回收,无法复用内存。要实现原地更新,需将a重复后的内容直接写入b已占用的内存空间,而非重新分配内存。
具体实现
方法1:基于广播的原地赋值
因为b的每一行都是a重复n次的结果,我们可以先生成a重复n次的一维数组,再通过广播将其赋值给b的所有行:
# 第一次初始化 a = np.zeros(N) b = np.tile(a, [m, n]) # 更新a后,原地复用b的内存更新数据 a[4] = 5 row = np.tile(a, n) b[:] = row
方法2:无临时数组的高效写法
如果想进一步减少临时数组的开销,可直接利用numpy的广播机制,省去中间的row数组:
# 更新a后,直接原地更新b a[4] = 5 b[:] = a.reshape(1, -1).repeat(n, axis=1)
这里a.reshape(1, -1)将一维的a转为二维行向量,repeat(n, axis=1)在列方向重复n次,最后通过b[:] = ...将该行向量广播到b的所有行,全程复用b的已有内存。
注意事项
- 若
m或n在两次操作中发生变化,b的形状需要调整,此时无法复用原有内存,必须重新分配数组。 - 原地赋值要求
b与a的dtype一致,初始化时需确保两者类型匹配,否则会触发类型转换错误。
内容的提问来源于stack exchange,提问作者hovnatan
相关产品推荐
相关产品推荐

