使用SciPy bootstrap计算中位数差值时遇维度错误如何解决?
解决SciPy bootstrap计算中位数差值时的ValueError问题
我尝试用SciPy的bootstrap函数计算两组数据的中位数差值,官方示例能正常运行:
from scipy.stats import mood, norm def my_statistic(sample1, sample2, axis): statistic, _ = mood(sample1, sample2, axis=-1) return statistic sample1 = norm.rvs(scale=1, size=100) sample2 = norm.rvs(scale=2, size=100) data = (sample1, sample2) res = bootstrap(data, my_statistic, method='basic')
但自行编写的中位数差值函数报错ValueError: zero-dimensional arrays cannot be concatenated:
import numpy as np def median_diff(group1, group2, axis=-1): diff = np.median(group1) - np.median(group2) return diff
调整axis参数为0、1、-1都无效,完整报错回溯如下:
ValueError Traceback (most recent call last) /tmp/ipykernel_259/1837026830.py in <cell line: 1>() ----> 1 boot = bootstrap(lab4data, median_diff, method="basic") /usr/local/lib/python3.10/dist-packages/scipy/stats/_resampling.py in bootstrap(data, statistic, n_resamples, batch, vectorized, paired, axis, confidence_level, method, bootstrap_result, random_state) 589 # Compute bootstrap distribution of statistic 590 theta_hat_b.append(statistic(*resampled_data, axis=-1)) --> 591 theta_hat_b = np.concatenate(theta_hat_b, axis=-1) 592 593 # Calculate percentile interval /usr/local/lib/python3.10/dist-packages/numpy/core/overrides.py in concatenate(*args, **kwargs) ValueError: zero-dimensional arrays cannot be concatenated
问题原因与修复方法
问题核心是你的median_diff函数返回的是0维标量,而bootstrap函数要求统计量返回至少1维的数组,这样才能通过np.concatenate拼接多次重采样的结果。官方示例中的mood函数本身就返回数组,所以能正常运行。
有两种简单的修复方式:
方式1:将结果包装为1维数组
import numpy as np def median_diff(group1, group2, axis=-1): diff = np.median(group1) - np.median(group2) return np.array([diff]) # 把标量转为1维数组
方式2:正确传递axis参数给np.median
让np.median利用axis参数返回数组而非标量,同时兼容批量重采样的场景:
import numpy as np def median_diff(group1, group2, axis=-1): return np.median(group1, axis=axis) - np.median(group2, axis=axis)
两种修改都能让函数返回符合要求的1维数组,从而避免拼接时的ValueError。
内容的提问来源于stack exchange,提问作者jaia
相关产品推荐
相关产品推荐

