【发布时间】:2021-11-01 22:04:06
【问题描述】:
我正在尝试将以下关于矩阵外积的 Matlab 代码 sn-p 重写为 python 代码,
function Y = matlab_outer_product(X,x)
A = reshape(X, [size(X) ones(1,ndims(x))]);
B = reshape(x, [ones(1,ndims(X)) size(x)]);
Y = squeeze(bsxfun(@times,A,B));
end
我对python代码的一对一翻译如下(考虑numpy数组和matlab矩阵的形状如何排列),
def python_outer_product(X, x):
X_shape = list(X.shape)
x_shape = list(x.shape)
A = X.reshape(*list(np.ones(np.ndim(x),dtype=int)),*X_shape)
B = x.reshape(*x_shape,*list(np.ones(np.ndim(X),dtype=int)))
Y = A*B
return Y.squeeze()
然后尝试输入,例如,
matlab_outer_product([1,2],[[3,4];[5,6]])
python_out_product(np.array([[1,2]], np.array([[3,4],[5,6]])))
输出不完全匹配。在matlab中,它输出
output(:,:,1) = [[3,5];[6,10]]
output(:,:,2) = [[4,6];[8,12]]
在python中,它输出
output = array([
[[ 3, 6],
[ 4, 8]],
[[ 5, 10],
[ 6, 12]]
])
它们几乎相同,但并不完全相同。我想知道代码有什么问题以及如何更改python代码以匹配matlab输出?
【问题讨论】:
-
MATLAB 使用 F 阶,其中尾随维度位于最外层。
numpy使用 C 顺序(默认情况下),前导维度最外层。请注意,MATLAB 在尾随维度上显示“迭代”。numpy将前导维度划分为块。专注于获得正确的值,但不要试图强制numpy布局匹配。这不值得努力。 -
在 matlab 代码中,您正在重塑 A 以从
X尺寸开始,然后是尺寸,在 python 代码中,它是相反的,尝试以相同的方式重塑两者,看看这是否能给您带来什么期待 -
@TadhgMcDonald-Jensen,不,这不会给我答案。因为例如在 matlab 中,一个 (2,2,3,1) 数组相当于一个 numpy (3,1,2,2) 数组。这就是我在上面的python代码中以这种特殊方式编写的原因。
-
@hpaulj 我明白了!但我想要完成的是将一个巨大的 matlab 程序重写为 python。程序的其余部分取决于此类功能。我需要使它们完全相同。否则,以后可能会付出更多的努力:-(
-
好的,但如果是这样的话,输出怎么错了?你说它几乎相同但不完全一样,如果你已经知道尺寸将被翻转,你会期待什么,因为这是我看到的唯一区别。
标签: python arrays numpy matlab