我有一个问题,我需要将一个非常大的二维数组(磁盘上的文件)与一个适合内存的较小数组进行卷积。 scipy.signal.fftconvolve
当数组适合内存时很好,但当它们不适合时无济于事。除了循环遍历每个数组中的所有点来手动计算卷积之外,还有其他合理的方法吗?我不擅长数学,但我想知道 fftconvolve
可以分成几部分并重新组合起来有一点重叠吗?还有什么?
最佳答案
我可以向您推荐两种不同的方法(虽然我不会冒险提供一些示例代码,但希望您不会介意弄清楚):
1) 使用 numpy.memmap
; “内存映射文件用于访问磁盘上大文件的小片段,而无需将整个文件读入内存。(...) memmap 对象可用于接受 ndarray 的任何地方。”
2) 将大数组拆分为瓦片,与 mode='full'
执行卷积,并叠加结果。对于每个图块,您将在图块周围获得一个“边界”,其宽度与卷积核的宽度相同。
可以将这两种方法结合起来(例如,从 memapped 文件中读取图块,并将结果叠加在另一个 memapped 文件中,即结果)。
关于scipy - 如何在大型数组上进行内存高效的 2D 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26409732/