X*Y项的平均值并保持numpy数组的维度

3

如何在二维数组中取四个相邻项(2*2)的平均值?我的输入是:

[[1,1,1,1],
 [1,1,0,0],
 [0,0,1,1],
 [0,0,0,0]]

应该得到的结果是:

[[1, 0.5],
 [0, 0.5]]

numpy.mean(x.reshape(-1, 4), 1)将数组展平并稍微以错误的顺序平均四个项目。

其他信息

例如,该数组是通过以下方法生成的:

n = 10
l = 100
A = np.zeros((l, l))
points = l*np.random.random((2, n**2))
A[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
A = ndimage.gaussian_filter(A, sigma=l/(4.*n))

那个输出是怎么工作的?你是指要计算数组中较小的单独的2 x 2块的平均值吗? - Andras Deak -- Слава Україні
2个回答

3
这里有一种利用重塑和求和的方法 -
m,n = A.shape
A.reshape(m/2,2,n/2,2).sum(axis=(1,3))/4.0

当然,这假设行数和列数都可以被2整除。

示例运行 -

In [87]: A
Out[87]: 
array([[8, 4, 6, 8, 1, 1],
       [6, 7, 8, 5, 3, 4],
       [1, 8, 8, 4, 7, 6],
       [1, 8, 7, 7, 2, 4]])

In [88]: m,n = A.shape

In [89]: A.reshape(m/2,2,n/2,2).sum(axis=(1,3))/4.0
Out[89]: 
array([[ 6.25,  6.75,  2.25],
       [ 4.5 ,  6.5 ,  4.75]])

1
总有一天,我应该真正理解这种方法 :) - Andras Deak -- Слава Україні
代码的某些部分在jupyter上发出警告:DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future app.launch_new_instance()。也许是我的原始数组上有什么问题...但这似乎可以工作。 - MarkokraM
@AndrasDeak 我认为在这种情况下,它会抛出错误而不是警告。 - Divakar
@Divakar 抱歉,你是对的,即使元素数量不会增加。那么警告消息的措辞很奇怪...因为你正在做相反的事情:使用整数而不是非整数(我认为)。 - Andras Deak -- Слава Україні
是的,我尝试了,但它给出另一个错误:参数数量无效。Anaconda3-2.4.1-MacOSX-x86_64 - MarkokraM
显示剩余7条评论

2
您也可以使用2D滤镜:
import numpy as np
from scipy import ndimage

A=np.array([[1,1,1,1],
 [1,1,0,0],
 [0,0,1,1],
 [0,0,0,0]],dtype=float)

k=np.array([[1,1],[1,1]])/4.
B=ndimage.convolve(A, k, mode='constant', cval=0.0)
C=B[0:-1:2,0:-1:2]

B包含了空间平均值,其中2x2的窗口每次移动1步。如果您只想在不相交的2x2区域上进行空间平均值,适当的索引(如C所示)将提供该功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接