Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二维阵列的Numpy元素平均值计算_Python_Numpy_Matrix_Multidimensional Array_Mean - Fatal编程技术网

Python 二维阵列的Numpy元素平均值计算

Python 二维阵列的Numpy元素平均值计算,python,numpy,matrix,multidimensional-array,mean,Python,Numpy,Matrix,Multidimensional Array,Mean,我是Python新手,面临着在2D numpy数组中计算元素平均值的问题。我在网上搜索过,没有找到适合这种东西的最佳算法 例如,我有一个2D数组: 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

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

例如,我有一个2D数组:

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块相邻元素,如何处理“边界”元素

非常感谢您的帮助

注意:在我的计算中,我假设有最终结果矩阵,在这种情况下:


如果选择使用
scipy
,则可以使用

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]])
第二个产生思考(每个位置总共有多少个元素):


您可以单独使用Numpy完成任务

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

def meanSurroud(arr, r, c):
    return np.mean(arr[max(r - 1, 0) : r + 2, max(c - 1, 0) : c + 2])
然后为源数组中的每个索引调用它,并将结果保存到 目标阵列:

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. ]])

这有用吗?哇,这太神奇了@obchardon!卷积正是我需要的!非常感谢你的帮助!
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. ]])