scipy 如何对2D numpy数组进行居中?

yzuktlbb  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(85)

有没有简单的方法计算下面的数组?

uc(i,j) = 0.25d0*(u(i,j+1)+u(i+1,j+1)+u(i+1,j)+u(i,j))

字符串
我试过了

from scipy.ndimage import generic_filter
  generic_filter(A, np.nanmean, mode='constant', cval=np.nan, size=2)


但这不起作用。比如说

A= np.array([[3, 4, 5],
   [5, 6, 7],
   [7, 8, 9]])


则通用过滤器的结果是:

array([[3, 3, 4],
   [4, 4, 5],
   [6, 6, 7]])


我期望第一个元素是=(3+4+5+6)/4 =4.5
如何在numpy中进行区域平均?

nfg76nw0

nfg76nw01#

您可以使用scipy.ndimage.correlate(或scipy.ndimage.convolve)来过滤图像。在这种情况下,你描述你的内核看起来像这样:

[[ 0, 0,    0],
 [ 0, 0.25, 0.25],
 [ 0, 0.25, 0.25]]

字符串
其中内核的中心是(i,j)。

> k = np.array([[0, 0, 0],[0, 0.25, 0.25],[0, 0.25, 0.25]])
> scipy.ndimage.correlate(A.astype(float), k, mode='constant')
array([[4.5 , 5.5 , 3.  ],
       [6.5 , 7.5 , 4.  ],
       [3.75, 4.25, 2.25]])

7tofc5zh

7tofc5zh2#

首先,A应该是float类型才能正确执行此操作。
当计算平均值时,第一行/列根本不会改变,也许应该跳过。对于浮子A,

>>> generic_filter(A, np.nanmean, mode='constant', cval=np.nan, size=2)
array([[3. , 3.5, 4.5],
       [4. , 4.5, 5.5],
       [6. , 6.5, 7.5]])

字符串
所以,generic_filter(...)[1:, 1:]可能是您需要的。
另一种选择是使用卷积-它更灵活一点,因为您可以自己设置过滤器,但您必须自己创建过滤器。在这种情况下,应跳过最后一行/列
示例如下:

from scipy.ndimage import convolve
convolution = np.ones((2, 2))/4
convolve(A, convolution)

相关问题