为什么3维NumPy数组链式调用std(axis=0)计算列标准差返回全0
问题原因拆解
你遇到的问题本质是线性统计量和非线性统计量的计算逻辑差异,均值是线性统计量支持逐轴链式计算,标准差是非线性统计量不支持这种操作,具体拆解如下:
第一步:先明确数组结构
你生成的三维数组a = (np.arange(12)).reshape(2,2,3)的完整结构为:
[ [[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]] ]
第二步:为什么链式计算均值是对的
均值的计算满足线性叠加特性,两次逐轴取均值等价于对前两个维度整体取均值:
- 第一次调用
a.mean(axis = 0)是对axis=0维度的两个2×3矩阵对应位置取平均,得到结果[[3,4,5],[6,7,8]] - 第二次调用
mean(axis = 0)是对上述结果的axis=0维度取平均,得到[4.5,5.5,6.5],刚好等于把前两个维度拍平后,最后一维每个位置所有元素的整体均值,所以结果符合预期。
第三步:为什么链式计算标准差得到全0
标准差是衡量一组数据离散程度的非线性统计量,不能逐轴拆分计算:
- 第一次调用
a.std(axis = 0)是对axis=0维度的两个对应数值取标准差,比如第一个位置0和6的标准差是3,最终得到的结果是全3数组[[3,3,3],[3,3,3]] - 第二次调用
std(axis = 0)时,参与计算的每一组数值都是两个3,离散度为0,自然得到全0的结果,和实际需求不符。
正确计算方法
如果你需要计算前两个维度合并后,最后一维每个位置对应所有元素的标准差,直接指定同时对前两个维度计算即可:
a.std(axis=(0,1))
得到的结果为array([3.35410197, 3.35410197, 3.35410197]),和你单独验证的np.std(np.array([1,4,7,10]))结果一致。
内容的提问来源于stack exchange,提问作者khowell
相关产品推荐
相关产品推荐

