我有一个多维的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累加器?
答案 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