【发布时间】:2017-09-28 05:09:36
【问题描述】:
那是this one的后续问题:
我确实有想要转换为 Python 的 Matlab 代码,其中包括 conv2。我可以模仿它在 Python 中的行为:
import numpy as np
from scipy import signal
def conv2(x, y, mode='same'):
return np.rot90(signal.convolve2d(np.rot90(x, 2), np.rot90(y, 2), mode=mode), 2)
如果我再打电话
f = [[2, 3, 4], [1, 6, 7]]
g = [[9, 1, 0], [2, 5, 8], [1, 3, 3]]
print conv2(f, g)
print conv2(g, f)
它给了我与 Matlab 相同的输出
conv2([[2,3,4];[1,6,7]], [[9,1,0];[2,5,8];[1,3,3]], 'same')
conv2([[9,1,0];[2,5,8];[1,3,3]], [[2,3,4];[1,6,7]], 'same')
然而,当一个参数是一个向量时,Matlab 的conv2 也有效。例如,
conv2([[2,3,4];[1,6,7]], [9,1,0]', 'same')
给予:
11 57 67
1 6 7
但我无法在 Python 中获得此输出,因为标准函数通常需要相同的输入维度。例如:
signal.convolve(f, [9, 1, 0])
产量
ValueError: in1 和 in2 应该具有相同的维度
和
signal.convolve2d(f, [9, 1, 0])
ValueError:所需数组的深度太小
如何为不同维度的输入实现相同的输出?
【问题讨论】:
-
MATLAB 没有“向量”,至少在 numpy 的一维数组的意义上没有。 MATLAB 中的最小维度是 2d,因此它始终适用于矩阵。这是在比较 MATLAB 和 numpy 代码时需要牢记的根本区别。但是您可以使用
[:,np.newaxis]或reshape在numpy 中轻松添加维度。
标签: python matlab scipy convolution code-conversion