如何基于两个同维度numpy数组按权重生成对应直方图?
高效实现方案
你提到percents每一行取值完全一致,我们可以提前提取公共的单行percents避免重复取值,再结合向量化操作或者优化的循环实现,性能远高于原始嵌套循环。
方案1:Numpy向量化实现(推荐,性能最优)
核心用numpy内置的repeat函数(C语言实现,无Python层循环开销),代码如下:
import numpy as np # 提前提取公共的percents单行(所有行相同,取第一行即可) percents_single = percents[0] # 若weights是pandas DataFrame,替换下方的weights为df.values即可 list_of_hists = [np.repeat(percents_single, row_weights).tolist() for row_weights in weights]
运行后得到的结果和你示例要求完全一致,且自动跳过权重为0的位置。
方案2:纯Python优化版(无需依赖numpy)
如果你不想引入numpy依赖,也可以用优化的纯Python写法,跳过权重为0的分支,用extend代替嵌套append后再展平,减少冗余操作:
percents_single = percents[0] list_of_hists = [] for w_row in weights: current_row = [] for p, w in zip(percents_single, w_row): if w > 0: current_row.extend([p] * w) list_of_hists.append(current_row)
效率说明
原始实现有两层Python级循环,还有多次append、最后展平的额外开销。以上两种方案在万行以上的大数据量场景下,性能可以提升几十到上百倍。
内容的提问来源于stack exchange,提问作者Wesley Cheek
相关产品推荐
相关产品推荐

