快速计算三维数组中元素周围平均值的方法



我想计算around中一个元素周围的和。例如,计算在5个单位内(在任何x、y、z方向上(的相邻元素的总和。我写了一个循环来做这件事。此函数用于计算三维阵列中块的平均值。数组的形状是(159,191,159)。它工作正常,但因为它将在另一个循环中使用,我想让它运行至少快一个数量级
如何使用NumPy(或任何其他方式(提高运行效率?例如,我想是条件np.sum()?有人能给我举一个简单有效的例子来计算平均值吗?

def patch_mean(coordinate_x,coordinate_y,coordinate_z,image,patch_radius):
for a in range(coordinate_x- patch_radius, coordinate_x + patch_radius):
for b in range(coordinate_y - patch_radius, coordinate_y + patch_radius):
for c in range (coordinate_z - patch_radius, coordinate_z + patch_radius):
if 0<a<159 and 0<b<191 and 0<c<159:
if image[a][b][c] != 0:
sum = sum + img[a][b][c]
count = count + 1
if count==0:
mean=0
else:
mean=sum/count
return mean

您可以使用卷积方法
(但是,我不确定它的性能。(

下面是一个二维数组的简单示例。这个例子引用自以下两篇文章:
在numpy中,如何有效地列出所有固定大小的子矩阵
仅使用Numpy 即可卷积2d

import numpy as np
from numpy.lib.stride_tricks import as_strided
data = np.arange(48).reshape(6, 8)
data =
[[ 0  1  2  3  4  5  6  7]
[ 8  9 10 11 12 13 14 15]
[16 17 18 19 20 21 22 23]
[24 25 26 27 28 29 30 31]
[32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47]]
mean_filter_shape = (3, 4)
data_new_shape = tuple(np.subtract(data.shape, mean_filter_shape) + 1) + mean_filter_shape
data_new = as_strided(data, data_new_shape, data.strides * 2)
data_new = 
[[[[ 0  1  2  3]
[ 8  9 10 11]
[16 17 18 19]]
...
[[28 29 30 31]
[36 37 38 39]
[44 45 46 47]]]]
mean_filter = np.ones(mean_filter_shape)
data_mean = np.einsum('ij,klij->kl', mean_filter, data_new) / np.prod(mean_filter_shape)
data_mean =
[[ 9.5 10.5 11.5 12.5 13.5]
[17.5 18.5 19.5 20.5 21.5]
[25.5 26.5 27.5 28.5 29.5]
[33.5 34.5 35.5 36.5 37.5]]

您可以将scipy.signal.convolvenumpy.ones内核一起使用。

文件:

  • scipy.signal.convolve
  • numpy.ones
import numpy as np
from scipy.signal import convolve
data = np.random.random((159,191,159))
patch_radius = 5
kernel = np.ones((2*patch_radius+1,2*patch_radius+1,2*patch_radius+1))
data_mean = convolve(data, kernel, mode='same') 

最新更新