二维数组的 Numpy 元素平均计算

Posted

技术标签:

【中文标题】二维数组的 Numpy 元素平均计算【英文标题】:Numpy element-wise mean calculation for 2D array 【发布时间】:2021-01-17 01:31:55 【问题描述】:

我是 Python 新手,遇到了在 2D numpy 数组中计算元素平均值的问题。我在网上搜索过,没有找到适合这些东西的最佳算法。

所以,例如我有这个二维数组:

array = np.arange(20).reshape(4,5)
array

Out[7]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19]])

我想获得另一个 2D numpy 数组,其元素等于前一个矩阵的元素平均值。此外,我的目标是让输出矩阵与输入矩阵形状相同

例如,我选择了一个 3*3 的邻域元素块,并从矩阵的第一个元素(零)开始:

由于它是一个“角”元素,我们无法计算 3 * 3 的平均值,所以我假设我们可以计算 2 * 2 的平均值: (0+1+5+6):4=3

然后我们将我们的 3 * 3 块移动到下一个元素:

并以相同的方式计算矩阵第一行的平均值,依此类推。 逐行、逐元素移动:

并以同样的方式计算它们的平均值:(0+1+2+5+6+7+10+11+12):9=6

然后继续。

您能告诉我如何创建与输入矩阵具有相同形状的平均元素矩阵吗?我应该使用带有 2 个变量的 for 循环来操作它吗?以及如何处理无法应用完整的 3 * 3 相邻元素块的“边界”元素?

非常感谢您的帮助!

附:在我的计算中,我假设有最终的结果矩阵,对于这种情况:

【问题讨论】:

这有帮助吗? ***.com/questions/40412432/… 【参考方案1】:

如果可以选择使用scipy,您可以使用2D convolution

import numpy as np
from scipy import signal

# Example input
x = np.array([[ 0,  1,  2,  3,  4],
              [ 5,  6,  7,  8,  9],
              [10, 11, 12, 13, 14],
              [15, 16, 17, 18, 19]])

# The moving window
y = np.ones((3,3))

# We convolve x with y and then we normalize those value with another convolution
#  |        first convolution        |/|              second convolution               |
r = signal.convolve2d(x,y,mode='same')/signal.convolve2d(np.ones(x.shape),y,mode='same')

它会产生:

array([[ 3. ,  3.5,  4.5,  5.5,  6. ],
       [ 5.5,  6. ,  7. ,  8. ,  8.5],
       [10.5, 11. , 12. , 13. , 13.5],
       [13. , 13.5, 14.5, 15.5, 16. ]])

它是如何工作的?

所以第一个卷积产生所需元素的总和:

array([[ 12,  21,  27,  33,  24],
       [ 33,  54,  63,  72,  51],
       [ 63,  99, 108, 117,  81],
       [ 52,  81,  87,  93,  64]])

第二个产生思考(每个位置求和了多少元素):

 array([[4., 6., 6., 6., 4.],
        [6., 9., 9., 9., 6.],
        [6., 9., 9., 9., 6.],
        [4., 6., 6., 6., 4.]])

【讨论】:

哇,太棒了@obchardon!卷积正是我需要的!非常感谢您的帮助!【参考方案2】:

你可以单独使用 Numpy 来完成你的任务。

要计算元素及其邻居的平均值,请定义以下内容 功能:

def meanSurroud(arr, r, c):
    return np.mean(arr[max(r - 1, 0) : r + 2, max(c - 1, 0) : c + 2])

然后为源 array 中的每个索引调用它并将结果保存在 一个目标数组:

result = np.empty_like(array, dtype=float)
for ind in np.ndindex(array.shape):
    result[ind] = meanSurroud(array, ind[0], ind[1])

结果是:

array([[ 3. ,  3.5,  4.5,  5.5,  6. ],
       [ 5.5,  6. ,  7. ,  8. ,  8.5],
       [10.5, 11. , 12. , 13. , 13.5],
       [13. , 13.5, 14.5, 15.5, 16. ]])

【讨论】:

以上是关于二维数组的 Numpy 元素平均计算的主要内容,如果未能解决你的问题,请参考以下文章

Numpy 二维移动平均线

numpy创建数组元素的获取

创建一维数组,其中元素是存储函数的二维 numpy 数组的总和

用java二维数组完成两个同学三科成绩,计算每位同学的总分, 各科的平均分

从导入的二维数组计算平均值

numpy创建二维数组