如何移除NumPy数组中的零维度?解决MCMC链切片后维度报错问题
问题根源
你得到(100000,0,9)数组的核心原因是操作逻辑出错:
- 原始链形状是
(100000,1024,9),执行[:,::10,:]降采样后,轴1的长度只有1024//10=102(每10个样本取1个,1024里只能选出102个有效样本) - 之后你尝试取
[:,2000:,:],但102远小于2000,切片后轴1直接变成空维度,自然没法后续操作
这种空维度数组本身没有有效数据,所以先修正采样步骤才是关键。
正确的采样与形状转换方法
1. 先调整采样逻辑,拿到有效样本
原始每条链只有1024个样本,根本不可能取出2000个,得重新规划采样方式:
- 要是想先降采样再保留末尾样本:
# 降采样后得到(100000, 102, 9) downsampled = chains[:, ::10, :] # 取降采样后的最后100个样本(根据需求改数量),得到(100000,100,9) selected = downsampled[:, -100:, :] - 要是想先保留末尾样本再降采样:
# 先取原始链的最后1000个样本,得到(100000,1000,9) last_samples = chains[:, -1000:, :] # 降采样后得到(100000,100,9) downsampled = last_samples[:, ::10, :]
2. 把三维数组转成(100000,9)
如果你想对每条链的采样样本做聚合(比如用均值/中位数代表这条链的参数估计),直接用numpy的聚合函数压缩轴1:
# 对每条链的采样样本取均值,得到(100000,9) result = downsampled.mean(axis=1) # 或者取中位数 result = np.median(downsampled, axis=1)
要是你只是想取每条链的最后一个样本,直接索引就行:
# 取每条链的最后一个样本,得到(100000,9) result = downsampled[:, -1, :]
空维度数组的应急处理
如果已经得到了a = np.zeros((100000,0,9))这种空数组,因为轴1没有元素,没法提取有效数据。要是需要生成占位符数组,可以用聚合函数生成全0的(100000,9)数组:
placeholder = a.mean(axis=1)
内容的提问来源于stack exchange,提问作者Not Sure
相关产品推荐
相关产品推荐

