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

使用statsmodels计算经验分布函数时出现报错的问题排查

经验分布函数(ECDF)绘制报错:ValueError: x and y do not have the same shape 原因及解决办法

错误原因

statsmodels的ECDF类要求输入的样本数据是一维数组/列表,但你定义的price_values是二维列表(每个元素都是单独的子列表),传入ECDF后会被当作二维数组处理,内部计算时因形状不匹配抛出x and y do not have the same shape错误。另外后续np.linspace(min(sample), max(sample))也会因为二维数组的min/max返回单元素数组,导致生成的x也是二维,后续绘图也会出现问题。

解决办法

把二维的样本数据转换成一维即可,有两种简单实现方式:

方式1:用numpy的flatten()方法转一维

修改样本定义部分,将二维列表转成numpy数组后再扁平化:

sample = np.array(price_values).flatten()

方式2:用列表推导式拆成一维列表

直接处理原始的二维列表:

sample = [item for sublist in price_values for item in sublist]

修改后的完整代码

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

price_values = [[4.2],
    [4.1],
    [4],
    [3.8],
    [3.9],
    [4.2],
    [4.5],
    [4.8],
    [5.2],
    [5.2],
    [5.2],
    [5.6],
    [5.2],
    [5.1],
    [5.3],
    [6],
    [6.2],
    [6.3],
    [6.2],
    [6],
    [5.5] ,
    [5.2],
    [4.8],
    [4.6]]

# 方式1:numpy扁平化(二选一即可)
sample = np.array(price_values).flatten()
# 方式2:列表推导式
# sample = [item for sublist in price_values for item in sublist]

ecdf = sm.distributions.ECDF(sample)
x = np.linspace(min(sample), max(sample))
y = ecdf(x)
plt.step(x, y)
plt.show()

内容的提问来源于stack exchange,提问作者PeterBe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:25:24