如何用isinstance区分scipy.stats中不同的冻结连续分布?
解决scipy冻结分布类型判断的问题
当你调用scipy.stats.uniform(...)或scipy.stats.norm(...)时,返回的是冻结的分布实例,类型统一为scipy.stats._distn_infrastructure.rv_continuous_frozen,所以直接用isinstance判断类型会失效。想要区分不同分布类型,可以用以下两种方法:
方法1:检查dist属性
每个冻结分布实例都有一个dist属性,指向对应的原始分布类(比如scipy.stats.uniform、scipy.stats.norm),直接对比这个属性就能准确判断:
import scipy.stats # 创建冻结分布实例 dist_u = scipy.stats.uniform(loc=0, scale=2) dist_n = scipy.stats.norm(loc=0, scale=1) # 判断均匀分布 print(dist_u.dist is scipy.stats.uniform) # 输出 True # 判断正态分布 print(dist_n.dist is scipy.stats.norm) # 输出 True # 交叉验证 print(dist_u.dist is scipy.stats.norm) # 输出 False
方法2:检查name属性
冻结实例的name属性是对应分布的名称字符串,适合简单场景下的判断:
print(dist_u.name == 'uniform') # 输出 True print(dist_n.name == 'norm') # 输出 True
补充说明
如果一定要用isinstance,可以针对dist属性判断它是否属于某类分布的基类,但区分具体分布还是上面两种方法更直接:
# 判断是否为连续分布类 print(isinstance(dist_u.dist, scipy.stats.rv_continuous)) # 输出 True
内容的提问来源于stack exchange,提问作者kampfkoloss
相关产品推荐
相关产品推荐

