【问题标题】:Convolution of 2D Arrays along a Single Axis二维阵列沿单轴的卷积
【发布时间】:2019-01-20 06:30:18
【问题描述】:

假设我有不同行数的单独二维数组:

数组一:

1 2 3
4 5 6
7 8 9

数组二:

10 11 12
13 14 15

我想将这两个数组沿零轴一起执行卷积,输出大小与数组 1 相同,类似于使用 mode='same' 时 scipy 的 convolve 方法将输出的内容。

所以两个数组的第 1 列被卷积在一起,等等,两个数组的第 2 列被卷积在一起,等等。我想以一种对于更大的数组(超过 100,000 行)计算上可行的方式来做到这一点,所以如果可能的话,我想避免使用 for 循环。 numpy/scipy 或任何其他库是否有执行此操作的任何方法?

所需的输出应如下所示:

10 22 36
53 83 117
122 158 198

与第一个输入数组的形状相同。每一列都是数组1和2中对应列的卷积得到的输出。

【问题讨论】:

  • 你能发布你想要的这个小样本的输出吗?
  • 当然——我更新了开头的帖子以包含输出的样子。
  • 如果您有 100,000 行,则解释循环的开销几乎为零。只有当卷积本身很小(例如 20 行)但有 100,000 列时,解释循环才会成为问题。
  • 我不认为我有那么大的东西,但卷积的总列数可以从 4 到 30,000 不等,具体取决于具体情况。

标签: arrays performance numpy scipy convolution


【解决方案1】:

np.convolve 的实现只调用了np.core.multiarray.correlate(因为卷积与翻转一个向量后计算相关性相同)。似乎很多人都想要一种计算沿某个轴的相关性的 Numpy 方法,但它不存在(目前):

Apply numpy's correlation to specific axis (autocorrelation)

Compact way of simulating 'axes' parameter in scipy.signal.fftconvolve?

但是,您可以使用循环并查看 scipy.signal.fftconvolve 是否为您的问题提供了足够的加速。

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2014-11-26
    • 2013-05-23
    • 2017-02-24
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多