python 3d信号处理数据的Numpy运算(周围细胞的3d核平均值)

ldioqlga  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(163)

我正在使用一个3d numpy数组(10,10,10)。我想知道是否有一种Python方法可以在我的3D numpy数组中的每个点上执行内核类型(移动窗口)加权平均操作?我的数据和第一次代码尝试如下所示。我只是想避免在存在numpy方法的情况下重新发明轮子。
更复杂的是,我也不确定如何解释位于边缘的格网像元(边界和角,因为它们周围只有部分窗口内核)。对于这些边界单元格,我还需要加权平均。换句话说,“例如”,对于位于索引处的点(0,0,0)[其上没有层],其在核加权平均操作之后的结果点需要是来自施加于其上的核的可用相邻点的加权平均。在这种情况下,当我们取平均值时,为了公平起见,应该将其除以其相邻点的可用点。而不像其它点那样依赖于核大小(3 * 5 * 5)的总数。
对于加权移动平均操作,周围的8个细胞(6个点与信号source_point位于同一层,两个点位于上一层和下一层)的source_point应具有70%(较强的权重)而非直接的周围单元格(16)在同一层中作为源信号的点应具有30%的权重核中存在的数据中的其他点具有0.1的权重(最弱信号)(如在Weights_of_3D_Kernel元素中可以看到的)。

import numpy as np

   np.random.seed(1)
   A = np.random.uniform(size=(10,10, 10))

   Weights_of_3D_Kernel = np.array([[

   [0.1, 0.1, 0.1, 0.1, 0.1],
   [0.1, 0.3, 0.5, 0.3, 0.1],
   [0.1, 0.5, 0.7, 0.5, 0.1],
   [0.1, 0.3, 0.5, 0.3, 0.1],
   [0.1, 0.1, 0.1, 0.1, 0.1]],

  [[0.1, 0.1, 0.1, 0.1, 0.1],
   [0.1, 0.5, 0.7, 0.5, 0.1],
   [0.1, 0.7, 1 , 0.7, 0.1],    # Signal source point is in this layer as denoted by weight=1
   [0.1, 0.5, 0.7, 0.5, 0.1],
   [0.1, 0.1, 0.1, 0.1, 0.1]],

  [[0.1, 0.1, 0.1, 0.1, 0.1],
   [0.1, 0.3, 0.5, 0.3, 0.1],
   [0.1, 0.5, 0.7 , 0.5, 0.1],
   [0.1, 0.3, 0.5, 0.3, 0.1],
   [0.1, 0.1, 0.1, 0.1, 0.1]]
   ])
q9yhzks0

q9yhzks01#

您可以使用scipy.ndimage.convolve来完成此操作

import scipy.ndimage

result = scipy.ndimage.convolve(A, weights=Weights_of_3D_Kernel, mode='constant')
norm = scipy.ndimage.convolve(np.ones_like(A), weights=np.ones_like(Weights_of_3D_Kernel) / Weights_of_3D_Kernel.size, mode='constant')
result = result / norm

其中norm变量用于模拟在边界处截断核。

相关问题