Scipy新版本下,如何获取未实例化分布的参数名称?
获取Scipy分布参数的替代方案
在新版Scipy中,直接通过inspect.signature(scipy_dist._pdf)获取参数的方法已经失效——因为_pdf这类底层方法的签名被统一封装,只会返回['kwds']这类通用参数,无法得到分布特有的参数信息。下面提供两种可靠的替代方法:
方法一:利用分布类的_shape_params属性
每个Scipy分布类都内置了_shape_params属性,专门存储该分布的形状参数名称;另外几乎所有分布都支持通用的loc(位置)和scale(尺度)参数,将两者合并即可得到完整的参数列表。
示例代码:
import scipy.stats as st def get_dist_params(dist_cls): # 获取分布特有的形状参数 shape_params = dist_cls._shape_params # 所有分布通用的位置、尺度参数 common_params = ['loc', 'scale'] # 合并并返回完整参数列表 return shape_params + common_params # 测试案例 print(get_dist_params(st.norm)) # 输出:['loc', 'scale'](正态分布无额外形状参数) print(get_dist_params(st.gamma)) # 输出:['a', 'loc', 'scale'](伽马分布的形状参数为a) print(get_dist_params(st.beta)) # 输出:['a', 'b', 'loc', 'scale'](beta分布的形状参数为a、b) print(get_dist_params(st.expon)) # 输出:['loc', 'scale'](指数分布无额外形状参数)
方法二:结合fit方法签名与默认参数验证
如果需要更严谨的参数确认,可以借助分布的fit方法签名(该方法的参数通常对应分布的形状参数),再补充通用参数,同时可通过_default_params获取参数默认值:
import inspect import scipy.stats as st def get_dist_params_v2(dist_cls): # 解析fit方法的签名,提取非数据类参数 sig = inspect.signature(dist_cls.fit) fit_params = [p for p in sig.parameters.keys() if p not in ['data', 'kwds']] # 补充通用参数并去重 common_params = ['loc', 'scale'] all_params = list(set(fit_params + common_params)) # 调整顺序:形状参数在前,通用参数在后 return [p for p in fit_params if p not in common_params] + common_params # 测试案例 print(get_dist_params_v2(st.poisson)) # 输出:['mu', 'loc'](泊松分布的形状参数为mu) print(st.poisson._default_params) # 查看默认值:{'mu': 1, 'loc': 0} print(st.norm._default_params) # 查看正态分布默认值:{'loc': 0, 'scale': 1}
注意事项
- 离散分布(如
st.poisson、st.binom)的形状参数同样可以通过_shape_params获取 - 部分特殊分布(如
st.rv_continuous的自定义子类)可能有特殊参数,_shape_params会准确列出其特有参数
内容的提问来源于stack exchange,提问作者Dylan Solms
相关产品推荐
相关产品推荐

