【问题标题】:numpy mean of multidimensional array多维数组的numpy均值
【发布时间】:2017-12-13 02:47:42
【问题描述】:

我有一个多维 numpy 数组,它恰好是一个图像数组。为什么使用 np.mean 的轴参数计算图像通道均值会产生不同的结果?

>>> X = np.array(np.random.random((9999, 128, 128, 4)) * 1e5, dtype='float32')
>>> X.shape
(9999, 128, 128, 4)
>>> mean_by_axis = np.mean(X, axis=(0, 1, 2))
array([ 13423.11523438,  13423.11523438,  13423.11523438,  13423.11523438], dtype=float32)
>>> mean = np.mean(X[:, :, :, 0])
50001.297

我希望 mean_by_axis[0] == mean。为什么不是这样?其余轴 3 索引 1、2 和 3 也是如此。我是否误解了如何在 np.mean 中使用轴参数?

使用 numpy 版本 '1.12.1'

我是否有可能溢出 float32 累加器?例如:

>>> X = np.random.random(size=(100, 128, 128, 4))
>>> np.mean(X, axis=(0, 1, 2))
array([ 0.49978557,  0.49985835,  0.50000321,  0.50015689])]
>>> np.mean(X[:, :, :, 0])
0.49978556940636332

这看起来是正确的。如果是这种情况,为什么 slice 方法也不会溢出累加器并给出相同的结果?也许 slice 方法使用 float64 累加器,而 axis 方法使用 float32 累加器?

【问题讨论】:

  • 我正在使用上面链接中描述的轴。我的问题与为什么轴结果与切片结果不同有关。

标签: python numpy image-processing


【解决方案1】:

由于您没有提供数据,我无法准确重现您的结果,但使用随机数据我可以重现该问题:

>>> import numpy as np
>>> X = np.random.rand(9999, 128, 128, 4).astype('float32')
>>> X.shape
>>> np.mean(X, axis=(0, 1, 2))
array([ 0.10241024,  0.10241024,  0.10241024,  0.10241024], dtype=float32)
>>> np.mean(X[:, :, :, 0])
0.50000387
>>> np.mean(X[:, :, :, 0].flatten())
0.50000387

这可能是数值精度不足的情况。您正在对 (9999*128*128 = 163823616) 浮点值求和,而 float32 的相对精度约为 10^-7,因此您正在浏览精度的边界。

我建议您在调用 mean 之前尝试将数组转换为具有更高精度的 float64,然后看看会发生什么。

>>> np.mean(X.astype('float64'), axis=(0, 1, 2))
array([ 0.50000323,  0.50004907,  0.50003198,  0.49999848])
>>> np.mean(X[:, :, :, 0].astype('float64'))
0.50000323305421812
>>> np.mean(X[:, :, :, 0].flatten().astype('float64'))
0.50000323305421812

【讨论】:

  • 相同。尝试使用更大的数字。明天我会发布一个代码来演示。
  • 好吧,我确实使用简单的随机数据重现了类似的问题。无论如何,我为此创建了一个 numpy 问题,因为它看起来像一个错误:github.com/numpy/numpy/issues/9393
【解决方案2】:

切入正题。 ;) 看起来简单的答案是:

mean = np.mean(X, axis=(0, 1, 2, 3))

鉴于您的数组(当我尝试它时)在 0.0001488 到 99999.99959 的范围内,我们可以假设它是正态分布的(考虑到大数字),平均约 50000 是合理的。

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2019-03-02
    • 1970-01-01
    • 2020-12-09
    • 2012-11-24
    相关资源
    最近更新 更多