二维数组的 Numpy 逐元素均值计算
Numpy element-wise mean calculation for 2D array
我是 Python 的新手,面临计算二维 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 的邻域元素块,并从矩阵的第一个元素(零)开始:
由于它是一个 'corner' 元素,我们无法计算 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 块相邻元素的 'border' 元素?
非常感谢您的帮助!
P.S。在我的计算中,我假设有最终结果矩阵,对于这种情况:
如果可以使用 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.]])
您可以单独使用 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. ]])
我是 Python 的新手,面临计算二维 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 的邻域元素块,并从矩阵的第一个元素(零)开始:
由于它是一个 'corner' 元素,我们无法计算 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 块相邻元素的 'border' 元素?
非常感谢您的帮助!
P.S。在我的计算中,我假设有最终结果矩阵,对于这种情况:
如果可以使用 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.]])
您可以单独使用 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. ]])