scipy - 如何在大型数组上进行内存高效的 2D 卷积

标签 scipy numerical-methods convolution

我有一个问题,我需要将一个非常大的二维数组(磁盘上的文件)与一个适合内存的较小数组进行卷积。 scipy.signal.fftconvolve当数组适合内存时很好,但当它们不适合时无济于事。除了循环遍历每个数组中的所有点来手动计算卷积之外,还有其他合理的方法吗?我不擅长数学,但我想知道 fftconvolve可以分成几部分并重新组合起来有一点重叠吗?还有什么?

最佳答案

我可以向您推荐两种不同的方法(虽然我不会冒险提供一些示例代码,但希望您不会介意弄清楚):

1) 使用 numpy.memmap ; “内存映射文件用于访问磁盘上大文件的小片段,而无需将整个文件读入内存。(...) memmap 对象可用于接受 ndarray 的任何地方。”

2) 将大数组拆分为瓦片,与 mode='full' 执行卷积,并叠加结果。对于每个图块,您将在图块周围获得一个“边界”,其宽度与卷积核的宽度相同。

可以将这两种方法结合起来(例如,从 memapped 文件中读取图块,并将结果叠加在另一个 memapped 文件中,即结果)。

关于scipy - 如何在大型数组上进行内存高效的 2D 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26409732/

相关文章:

python - Numpy 和 Scipy 在 Windows 上的安装

matlab - 绘制波动方程二维数值解的问题

python - 如何使用 python 中提供的 Runge-Kutta 方法解决以下问题

python - 如何创建过滤器不跨一维移动的转换层

image-processing - 将高斯模糊中的 2d 掩模转换为 1d

python - scipy.integrate.quad 大数精度

python - 如何有效地从稀疏矩阵中删除列?

python - 如何在Python中计算多维数组的线性趋势

matlab - 寻找柯西问题的解。在Matlab中

c++ - 具有 FFT 问题的高斯模糊