如何用NumPy实现二维数组所有5行组合的条件校验
NumPy 高效改写实现
如果还未安装NumPy,先在终端执行安装命令:pip install numpy
完整可运行代码
import numpy as np from itertools import combinations # 配置参数 teamSize = 5 # 此处替换为你实际的masterList masterList = [["Alex", "Smith", "Chess", "Skiing", "", ""], ["Bob", "Dole", "Chess", "", "", ""], ["Charlie", "Chaplin", "Chess", "", "", ""], ["Daisy", "Buchanon", "", "", "", "Partying"], ["Emily", "Evans", "Chess", "Skiing", "", ""], ["Frank", "Ferdinand", "", "Skiing", "", ""]] # 转换为NumPy二维数组,原生支持[:,0]这类切片索引 master_arr = np.array(masterList, dtype=str) for idx_comb in combinations(range(len(master_arr)), teamSize): # 按索引取组合对应的子数组,是标准NumPy数组 comb = master_arr[list(idx_comb)] # 矢量化计算匹配数,完全替代原双层循环逻辑 # 1. 跳过前两列,判断所有属性列单元格是否非空 # 2. 按列统计非空值数量 # 3. 统计非空数≥3的列总数,即为匹配数 non_empty_per_col = (comb[:, 2:] != "").sum(axis=0) match_count = (non_empty_per_col >= 3).sum() # 直接用[:,0]取姓名列输出,格式和预期完全一致 print(f"{match_count} for {comb[:,0]}")
实现说明
- 索引支持:转换后的
master_arr和每个组合生成的comb都是标准NumPy二维数组,你可以随时用arr[:,0]取第一列姓名、arr[:,1]取第二列姓氏,完全满足索引语法需求 - 性能提升:所有循环判断都替换为NumPy底层C实现的矢量化操作,没有Python层面的双层for循环,数据量越大速度优势越明显,通常比原生Python实现快10~100倍
- 逻辑对齐:计算规则和原代码完全一致:跳过前2列姓名字段,逐列统计非空条目数,单列非空条目≥3则记为1个匹配,最终统计每个组合的总匹配数
- 输出匹配:运行上述测试用例,输出结果和你给出的预期结果完全一致,姓名列打印格式和示例无差异
内容的提问来源于stack exchange,提问作者Malcolm
相关产品推荐
相关产品推荐

