多维NumpyArray减去平均值

2024-06-16 09:17:52 发布

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

我正在学习Numpy中的广播,在我正在读的书(Python for Data Analysis by Wes McKinney)中,作者提到了以下例子来“贬低”二维数组:

import numpy as np

arr = np.random.randn(4, 3)
print(arr.mean(0))
demeaned = arr - arr.mean(0)
print(demeaned)
print(demeand.mean(0))

这有效地导致数组demeaned的平均值为0。你知道吗

我想把这个应用到一个像三维阵列的图像上:

import numpy as np

arr = np.random.randint(0, 256, (400,400,3))
demeaned = arr - arr.mean(2)

当然失败了,因为根据广播规则,尾随尺寸必须匹配,这里不是这样:

print(arr.shape)  # (400, 400, 3)
print(arr.mean(2).shape)  # (400, 400)

现在,我主要是通过从数组第三维度的每个索引中减去平均值来实现的:

demeaned = np.ones(arr.shape)

for i in range(3):
    demeaned[...,i] = arr[...,i] - means

print(demeaned.mean(0))

此时,返回的值非常接近于零,我认为,这是一个精度错误。我的想法是对的还是我错过了另一个警告?你知道吗

而且,这并不是实现我想要实现的目标的最干净、最“numpy”的方式。是否有一个函数或一个原则,我可以用来改进代码?你知道吗


Tags: importnumpyforasnprandom数组mean
2条回答

从numpyversion1.7.0开始,^{}和其他几个函数在其axis参数中接受一个元组。这意味着您可以一次对图像的所有平面执行操作:

m = arr.mean(axis=(0, 1))

这个平均值将具有形状(3,),图像的每个平面有一个元素。你知道吗

如果要分别减去每个像素的平均值,则必须记住,广播将在右边缘对齐形状元组。这意味着您需要插入一个额外的维度:

n = arr.mean(axis=2)
n = n.reshape(*n.shape, 1)

或者

n = arr.mean(axis=2)[..., None]

试试^{}。你知道吗

np.apply_along_axis(lambda x: x - np.mean(x), 2, arr)

输出:得到相同形状的数组,其中每个单元格都按所需的维度降级(第二个参数,这里是2)。你知道吗

相关问题 更多 >