You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用scipy.ndimage.correlate实现IDL convol()的完全重叠计算?

用scipy.ndimage.correlate复现IDL convol()的完全重叠计算

可行,但需要调整参数或对结果做针对性截取,具体说明如下:

核心差异

IDL的convol()默认仅保留核与输入完全重叠的计算结果(对应卷积领域的valid模式),输出尺寸为输入尺寸 - 核尺寸 + 1;而scipy.ndimage.correlate默认会对输入边缘做0填充(mode='constant'),输出尺寸与输入完全一致。

实现方法

手动截取完全重叠区域

先用默认参数运行correlate,再从结果中提取仅完全重叠的部分:

import numpy as np
from scipy.ndimage import correlate

input_arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
kernel = np.array([[0,0,0],[0,1,0],[0,0,0]])

# 执行默认的correlate(边缘填充0)
full_result = correlate(input_arr, kernel)
# 计算完全重叠区域的尺寸
out_shape = (input_arr.shape[0] - kernel.shape[0] + 1, 
             input_arr.shape[1] - kernel.shape[1] + 1)
# 计算截取的起始索引(基于核中心位置)
start_idx = ((kernel.shape[0]-1)//2, (kernel.shape[1]-1)//2)
# 截取得到完全重叠区域的结果
valid_result = full_result[start_idx[0]:start_idx[0]+out_shape[0], 
                           start_idx[1]:start_idx[1]+out_shape[1]]
print(valid_result)  # 输出 [[5]],与IDL convol()的完全重叠计算结果一致

补充说明

你给出的示例中,scipy.ndimage.correlate输出的3x3矩阵是默认边缘填充0的结果,而IDL convol()在该场景下(输入与核尺寸相同)会输出单个元素5——这才是仅完全重叠位置的计算结果。如果需要和IDL的输出完全匹配,就需要按上述方法截取核心区域。

内容的提问来源于stack exchange,提问作者Arya Akmal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:45:59