如何对这段用于阈值计数的Python for循环做NumPy向量化优化
优化后向量化实现代码
import numpy as np # 第一步:一次性筛选出第2列等于0的样本的第0列值,避免循环中重复计算 valid_col0 = array_ML[array_ML[:, 2] == 0, 0] # 第二步:统计0到bin_number-1区间内各数值的出现频次 counts = np.bincount(valid_col0[valid_col0 < bin_number].astype(int), minlength=bin_number) # 第三步:通过后缀和计算每个阈值i对应的「大于i的样本数」 array_ = np.cumsum(counts[::-1])[::-1] - counts # 可选补充:处理取值超过bin_number的样本,这部分样本大于所有阈值,直接统一累加 out_of_range_cnt = np.sum(valid_col0 >= bin_number) array_ += out_of_range_cnt
实现逻辑说明
- 原循环的核心逻辑是对每个阈值
i,统计同时满足array_ML[:,0] > i、array_ML[:,2] ==0的样本量,原实现每次循环都重复做全量过滤,数据量大时冗余计算极高。 - 优化后仅做1次条件过滤,再通过
bincount统计频次、cumsum计算后缀和得到所有阈值对应的统计值,时间复杂度从O(bin_number * N)降到O(N),数据量越大性能提升越明显。
内容的提问来源于stack exchange,提问作者Exciting_Squid
相关产品推荐
相关产品推荐

