如何将1维numpy数组重复堆叠为指定行数的2维numpy矩阵
实现一维numpy数组按行重复堆叠的方法
问题背景
现有1维numpy数组:[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],需要将其重复5次按行堆叠,构造5行10列、每行内容与原数组完全一致的2维矩阵,期望输出如下:
[[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]]
numpy中以下几种内置方法都可以高效实现该需求:
np.tile(推荐,语义最匹配)
该方法的设计目的就是按指定维度重复铺放数组,代码最直观、执行效率也属于第一梯队:import numpy as np arr = np.array([0,0,0,0,0,0,0,0,0,1], dtype=np.float64) # 参数传入(行重复次数, 列重复次数),列不需要重复所以传1 result = np.tile(arr, (5, 1))np.repeat+ 维度扩展np.repeat用于沿指定轴重复数组元素,先给原1维数组增加一个行维度,再沿行轴重复5次即可:import numpy as np arr = np.array([0,0,0,0,0,0,0,0,0,1], dtype=np.float64) # arr[np.newaxis, :] 将数组形状从(10,)转为(1,10) result = np.repeat(arr[np.newaxis, :], 5, axis=0)np.vstack(写法最简洁)
垂直堆叠接口,直接传入包含5份原数组的列表即可完成堆叠,适合快速写代码的场景:import numpy as np arr = np.array([0,0,0,0,0,0,0,0,0,1], dtype=np.float64) result = np.vstack([arr]*5)广播运算实现
利用numpy的广播机制,通过形状为(5,1)的全1矩阵和原数组做矩阵乘法,自动广播得到目标矩阵,适合需要同步做数值计算的场景:import numpy as np arr = np.array([0,0,0,0,0,0,0,0,0,1], dtype=np.float64) result = np.ones((5, 1)) @ arr[np.newaxis, :]
效率提示:处理大规模数组时,优先选择
np.tile和np.repeat,二者是numpy底层专门为数组重复操作实现的接口,内存开销最小、运行速度最快;np.vstack在数据量小于100万级时和前两者速度差异极小,日常使用完全足够。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

