无需显式循环/推导式创建组合NumPy数组
无需显式循环构造目标数组的方法
当然有更高效的实现方式——利用NumPy的广播机制,完全不用写Python循环,而且底层是C级别的运算,处理长数组时速度会快很多。
核心思路
你的pattern函数本质是给每个x乘上一个固定的5×3权重模板,所以我们可以先把这个模板抽出来,再通过广播让数组a和模板进行元素级相乘,自动完成批量计算。
具体实现
import numpy as np # 原长数组 a = np.array([1.3, -1.8, 0.3, 11.4]) # 定义pattern对应的权重模板(把x替换为1/-1/0) template = np.array([ [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1], [-1, -1, -1] ]) # 通过扩展a的维度实现广播相乘 out = a[:, np.newaxis, np.newaxis] * template print(out.shape) # 输出 (4, 5, 3)
关键细节
a[:, np.newaxis, np.newaxis]把原来形状为(N,)的数组变成(N, 1, 1),这样就能和形状为(5,3)的template触发广播规则,最终得到(N,5,3)的结果。- 你也可以用
a.reshape(-1, 1, 1)代替维度扩展,效果完全一致,看个人编码习惯。 - 这个方法生成的
out和原列表推导式的结果完全相同,但对于超长数组,效率会远高于Python循环。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

