You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:27:16