如何统计重复X输入对应的Y输出的唯一值数量及差异情况
统计重复X样本对应Y值唯一数的实现方案
思路可行性判断
你构造的「每个元素为(X样本, 对应Y值)元组」的列表是可行的思路,只需要解决numpy数组不可哈希的问题即可——因为numpy数组不能直接作为字典的键,也无法直接传入Counter做统计,需要先转成可哈希的类型。
具体实现步骤
1. 聚合相同X对应的所有Y值
利用字典聚合,key为X样本转成的可哈希字节串,value为该X对应的所有Y的列表:
from collections import defaultdict import numpy as np x_to_ys = defaultdict(list) # 如果你已经构造了list_of_tups,直接遍历即可 for x_sample, y_val in list_of_tups: # 将二维的X样本转成可哈希的字节串作为key x_key = x_sample.tobytes() x_to_ys[x_key].append(y_val)
如果还没构造元组列表,直接从原始X、Y数组处理效率更高:
x_to_ys = defaultdict(list) for i in range(X.shape[0]): x_key = X[i].tobytes() x_to_ys[x_key].append(Y[i])
2. 统计每个X对应的Y唯一值数量
同样把Y数组转成字节串去重,统计结果:
stat_res = [] for x_key, y_list in x_to_ys.items(): # 对当前X对应的所有Y去重 unique_y_map = {y.tobytes(): y for y in y_list} unique_ys = list(unique_y_map.values()) stat_res.append({ "x_sample": np.frombuffer(x_key, dtype=x_sample.dtype).reshape(3, 30), # 可选:把X从字节串还原回数组 "occur_times": len(y_list), "unique_y_count": len(unique_ys), "unique_y_list": unique_ys })
3. 筛选异常情况
如果要找出「同一个X对应多个不同Y」的样本,直接过滤统计结果即可:
# 筛选出重复X对应不同Y的情况 abnormal_cases = [item for item in stat_res if item["occur_times"] > 1 and item["unique_y_count"] > 1] print(f"共有{len(abnormal_cases)}个重复X样本对应多个不同的Y值")
注意事项
如果你的数据存在浮点精度问题,判断X是否相同的时候可以先做指定精度的四舍五入再转字节串,避免因为极小的精度误差导致本来相同的X被判定为不同。
内容的提问来源于stack exchange,提问作者D4w1d
相关产品推荐
相关产品推荐

