如何将np.repeat结果写入已分配内存以避免内存重分配?
如何将np.repeat(或等效操作)的结果写入已分配的内存空间?
我需要把np.repeat(或等效函数)的输出直接写入一个已创建的大数组中——很多numpy函数都支持out=参数实现这种原地写入。这么做的原因是我有一个尺寸匹配且后续不再使用的超大数组,复用它的内存可以避免大量内存重分配开销。
我试过下面的写法,但没提升分配速度:
diff_da1[:,:,:] = np.repeat(np.linalg.norm(diffs, axis=2)[:, :, None], repeats=d, axis=2) dist_point_vertex = diff_da1
用广播技巧有轻微提速,但速度还是不够理想:
diff_da1[:,:,:] = np.linalg.norm(diffs, axis=2)[:,:,None] dist_point_vertex = diff_da1
补充提示:这本质上是一个更通用的问题——如何将涉及多个numpy数组的运算结果,写入和这些数组无关的已分配内存空间?
更新:最小可复现代码示例
vector_set_1 = np.random.rand(1500,2) vector_set_2 = np.random.rand(1500,2) # 预先分配目标内存空间 first_allocation = np.einsum('ij,kj->ik', vector_set_1, vector_set_2) # 用first_allocation完成一些操作 # 生成需要扩展形状的目标数组 object_to_be_repeated = np.einsum('ij,ij->i', vector_set_1, vector_set_1) first_allocation[:,:] = object_to_be_repeated[:,None] # 对新值执行原地操作 first_allocation.__iadd__(first_allocation)
目前测试下来最快的实现方式是:
np.copyto(first_allocation, object_to_be_repeated[:, None])
内容的提问来源于stack exchange,提问作者Miguel Montes
相关产品推荐
相关产品推荐

