基于Numpy按位置统计元素重复频次的实现需求
带权重无放回全采样的位置频次统计
已实现的采样代码
import numpy as np np.random.seed(seed=123) N = 10 samples = [] P = [0.5, 0.3, 0.1, 0.1] for i in np.arange(N): picks = np.random.choice(4, size=4, replace=False, p=P) samples.append(picks) samples
采样结果
[array([1, 0, 3, 2]), array([3, 1, 0, 2]), array([1, 0, 3, 2]), array([0, 1, 3, 2]), array([1, 0, 2, 3]), array([0, 1, 3, 2]), array([1, 0, 3, 2]), array([0, 3, 1, 2]), array([2, 1, 0, 3]), array([0, 1, 2, 3])]
频次统计实现
方法1:向量化统计(高效推荐)
将采样结果转换为二维numpy数组后,通过np.bincount统计每个位置的数字频次:
# 转换为二维数组 samples_arr = np.array(samples) # 初始化频次矩阵:行对应数字0-3,列对应位置0-3 freq_matrix = np.zeros((4, 4), dtype=int) # 遍历每个位置统计频次 for pos in range(4): freq_matrix[:, pos] = np.bincount(samples_arr[:, pos], minlength=4) print("各数字在不同位置的频次分布:") print(freq_matrix)
运行输出:
各数字在不同位置的频次分布: [[4 6 1 0] [5 3 2 0] [1 0 1 8] [0 1 6 2]]
方法2:简洁版向量化统计
用np.apply_along_axis简化代码:
samples_arr = np.array(samples) freq_matrix = np.apply_along_axis(lambda x: np.bincount(x, minlength=4), axis=0, arr=samples_arr) print(freq_matrix)
单独查询特定数字的位置频次
如果需要单独查看某个数字在指定位置的出现次数,直接索引频次矩阵即可:
# 数字0在首位(位置0)的次数 print(f"数字0在首位的出现次数:{freq_matrix[0, 0]}") # 数字1在首位的次数 print(f"数字1在首位的出现次数:{freq_matrix[1, 0]}")
输出:
数字0在首位的出现次数:4 数字1在首位的出现次数:5
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

