【问题标题】:Averaging using a circular mask使用圆形掩码进行平均
【发布时间】:2021-05-07 01:30:52
【问题描述】:

我想知道下面的 python 脚本是否有任何优化,因为对我来说它运行得相当慢。我想要的是从矩阵 Z 的当前元素获取半径 r 内的平均值。X 和 Y 具有与 Z 相同的维度(二维数组)。有没有人有改进的解决方案?提前谢谢你。

Z_mean = np.zeros(Z.shape)
for ii, zz in np.ndenumerate(Z):
    msk = (X-X[ii])**2 + (Y-Y[ii])**2 <= r**2
    Z_mean[ii] = np.nanmean(Z[msk])     

【问题讨论】:

  • 请发布 MCVE。我不知道这里的数量是多少。这段代码的编写方式,我很惊讶它完全可以工作。你的意思是Z_mean = np.zeros_like(Z)
  • 评论/提示:分而治之!。创建 2 个循环(一个用于 ii,一个用于 zz)计算在外部循环中内部循环中不变的内容。 (我认为。不是 Python 专家,而是经验丰富的程序员)

标签: python numpy mask circular-dependency


【解决方案1】:

先构造一个循环均值核:

x = np.arange(-r, r+1)
kernel = (x[None,:]**2 + x[:,None]**2 <= r**2).astype(float)
kernel /= np.sum(kernel)

然后将其应用于 Z:

from scipy.signal import convolve2d
Z_mean = convolve2d(Z, kernel)

【讨论】:

  • 谢谢,我已经实现了你建议的代码,效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2021-10-08
  • 2012-12-25
  • 1970-01-01
  • 2018-06-30
相关资源
最近更新 更多