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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:27:20