多维数组的numpy平均值

2024-06-02 08:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个多维numpy数组,它正好是一个图像数组。为什么计算图像通道意味着在使用轴参数时产生不同的结果np.平均值?在

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

我期望平均值为平均值。为什么不是这样?剩下的3轴指数1、2和3也是如此。我是否误解了如何在中使用轴参数np.平均值?在

使用numpy版本“1.12.1”

我是否可能使float32收集器溢出?例如:

^{pr2}$

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


Tags: 方法图像numpy参数npslicerandom数组
1条回答
网友
1楼 · 发布于 2024-06-02 08:42:41

我无法准确再现您的结果,因为您没有提供您的数据,但我可以用随机数据重现问题:

>>> 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)个浮点值,浮点32的相对精度为~10^-7,因此忽略了精度的边界。在

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

^{pr2}$

相关问题 更多 >