python - 从多维 Numpy 数组中减去平均值

标签 python arrays numpy array-broadcasting

我目前正在学习 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”的方式。是否有一个功能或原则可以用来改进代码?

最佳答案

从 numpy 版本 1.7.0 开始,np.mean和其他几个函数在其 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]

关于python - 从多维 Numpy 数组中减去平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093981/

相关文章:

java - Hangman 赋值和循环条件

python - 根据排序值匹配两个数组的元素(Python)

python - Django DST 时间更改问题与 django datetimefield

java - 如何按字母顺序对字符串数组进行排序(不使用compareTo或Arrays.sort)

python - 如何处理不存在的装饰器

c++ - 使用数组和 rand 来计算 1-10 之间整数的实例数?

numpy - 使用 cProfile 分析 numpy 没有给出有用的结果

python - 导入错误 : cannot import name NUMPY_MKL

具有已知键输入的 Python 3 字典

python - 使用 Django 时,Pylint 不会报告错误的导入顺序