Python中基于shape=(296,3)的数组计算各取值组合概率的方法
Python计算数组三列取值组合的出现概率
针对形状为(296,3)、三列取值范围固定的数组,你可以选择以下两种无遗漏的实现方式,覆盖全部18种可能组合,不会漏掉样本中未出现的组合。
方法1:纯NumPy实现(无额外依赖、计算速度快)
核心思路是给每个唯一三元组合分配0-17的整数编码,直接统计编码频次后换算概率:
import numpy as np # 替换为你自己的真实数组,要求arr.shape=(296,3) # arr = np.array(...) sample_total = arr.shape[0] # 为每个三元组生成唯一编码:第一列权重9、第二列权重3、第三列权重1,刚好覆盖0-17共18个值 combo_code = arr[:, 0] * 9 + arr[:, 1] * 3 + arr[:, 2] # 统计频次,minlength参数保证18种组合全部被统计,未出现的组合频次记为0 combo_count = np.bincount(combo_code, minlength=18) # 计算概率 combo_prob = combo_count / sample_total # 整理为「组合-频次-概率」的可读格式 result = [] for code, count, prob in zip(range(18), combo_count, combo_prob): c1 = code // 9 c2 = (code % 9) // 3 c3 = code % 3 result.append( ((c1, c2, c3), count, prob) ) # 示例:打印所有组合的概率 for combo, cnt, p in result: print(f"组合{list(combo)}:出现{cnt}次,出现概率{p:.4f}")
方法2:Pandas实现(适合后续表格分析场景)
如果你的数据后续需要做更多结构化分析,可以直接用Pandas的频次统计接口,配合全组合索引补全缺失项:
import pandas as pd import numpy as np from itertools import product # 替换为你自己的真实数组 # arr = np.array(...) # 生成所有18种理论存在的组合 all_possible_combos = list(product([0, 1], [0, 1, 2], [0, 1, 2])) # 转为DataFrame统计频次 df = pd.DataFrame(arr, columns=["col1", "col2", "col3"]) combo_count = df.value_counts().reindex(all_possible_combos, fill_value=0) combo_prob = combo_count / len(arr) # 示例:打印所有组合的概率 for combo, p in combo_prob.items(): print(f"组合{list(combo)}:出现概率{p:.4f}")
校验提示:两种方法计算得到的所有组合概率求和结果应为1,受浮点数精度影响可能存在1e-15级别的微小误差,属于正常情况。
内容的提问来源于stack exchange,提问作者gjfreitas
相关产品推荐
相关产品推荐

