基于主向量与布尔共享数组生成m×n数组的Python高效实现咨询
最优实现方案(Numpy向量化)
完全利用Numpy底层C级别的向量化操作替代Python层循环,运行效率远高于原有嵌套循环实现,代码更简洁符合Python风格:
import numpy as np # 输入参数 p = np.array((1,2,3,4,5,6,10,30,40,60,100,300,400,600)) genome = np.array((1, 0, 1, 1, 0, 1), dtype=bool) m = 3 # 要生成的向量个数 n = genome.size # 1. 初始化所有行,先填充公共的base值 res = np.tile(p[:n], (m, 1)) # 如果需要和示例一致输出浮点型,可加astype(float): # res = np.tile(p[:n], (m, 1)).astype(float) # 2. 获取需要动态填充的列索引 dynamic_cols = np.where(genome)[0] k = dynamic_cols.size # 3. 把压缩的动态元素变形后直接赋值到对应位置 res[1:, dynamic_cols] = p[n:].reshape(m-1, k) # 输出验证 for row in res: print(row)
逻辑说明
- 布尔向量中为True的位置对应需要每行独立填充的动态列,数量记为k;为False的位置对应所有行共用的静态列。
- 主向量V的结构符合规则:前n个元素是所有行的初始值,后续的
k*(m-1)个元素依次是第2到第m行的动态列取值。 - 整个实现无Python层面的循环操作,单轮运行耗时可压缩到5μs以内,相比原有实现提速近10倍。
无Numpy依赖的Python原生实现
如果不需要处理大规模数据,也可以用纯Python实现:
# 输入参数 p = (1,2,3,4,5,6,10,30,40,60,100,300,400,600) genome = (1, 0, 1, 1, 0, 1) m = 3 n = len(genome) k = sum(genome) base = list(p[:n]) res = [base.copy()] # 拆分动态部分 dynamic_parts = [p[n + i*k : n + (i+1)*k] for i in range(m-1)] for part in dynamic_parts: row = base.copy() ptr = 0 for idx, is_dynamic in enumerate(genome): if is_dynamic: row[idx] = part[ptr] ptr += 1 res.append(row) # 输出验证 for row in res: print(row)
内容的提问来源于stack exchange,提问作者user17482085
相关产品推荐
相关产品推荐

