Numpy如何沿多维度重复数组以匹配另一数组的维度
Numpy数组多维度扩展匹配另一数组形状的高效方案
你可以通过numpy内置的广播机制直接完成扩展,完全避免循环操作,效率远高于逐维度repeat的实现,以下是两种常用方案:
方案1:使用np.broadcast_to(最高效,生成视图)
该方案利用numpy的广播规则,无需实际复制数据,仅生成虚拟视图,仅读场景下性能最优:
import numpy as np a = np.arange(300) b = np.zeros((300, 10, 20, 40, 50)) # 先给a补全尾部维度,和b的维度数量对齐 a_aligned = a.reshape(a.shape + (1,) * (b.ndim - a.ndim)) # 直接广播到b的形状 c = np.broadcast_to(a_aligned, b.shape) # 若需要可写的数组,额外调用copy即可 # c = np.broadcast_to(a_aligned, b.shape).copy()
*注意:np.broadcast_to生成的是只读视图,直接修改会报错,有修改需求请调用.copy()生成实际数组。
方案2:使用np.tile(一次性生成可写数组)
如果需要直接得到可修改的实体数组,可以用np.tile一次性完成所有维度的重复:
a_aligned = a.reshape(a.shape + (1,) * (b.ndim - a.ndim)) # 定义各维度重复次数,首维不重复,后续维度和b对应维度长度一致 repeat_times = (1,) + b.shape[1:] c = np.tile(a_aligned, repeat_times)
两种方案的性能都远优于逐维度循环repeat的实现,维度数量越多提升越明显,且均支持b的维度数量、各维度长度为任意值的场景。
内容的提问来源于stack exchange,提问作者Liris
相关产品推荐
相关产品推荐

