多维数组的numpy意思

时间:2017-07-09 07:02:29

标签: python numpy image-processing

我有一个多维的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] ==是的意思。为什么不是这样?其余的轴-3指数1,2和3也是如此。我是否误解了如何在np.mean中使用axis参数?

使用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累加器?

1 个答案:

答案 0 :(得分: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,因此您可以略读精度的边界。

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

>>> 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