我正在尝试将以下matlab代码转换为pyhton:
Im = rand(961, 220)+1;
x0 = rand(961, 220)+1;
y0 = rand(961, 220)+1;
%
[a1 b1]=size(x0);
re_x0=reshape(x0,a1*b1,1);
re_y0=reshape(y0,a1*b1,1);
eIm1=Im(sub2ind(size(Im),floor(re_x0'+1),floor(re_y0'+1)));
Im1=reshape(eIm1',size(Im));
以下是我目前为止用Python编写的脚本:
import numpy as np
Im = np.random.rand(961, 220) + 1
x0 = np.random.rand(961, 220) + 1
y0 = np.random.rand(961, 220) + 1
[a1, b1] = x0.shape
re_x0 = x0.reshape(a1 * b1, 1)
re_y0 = y0.reshape(a1 * b1, 1)
ind=np.ravel_multi_index((np.int64(np.floor(re_x0.T + 1))-1,np.int64(np.floor(re_y0.T + 1))-1),dims=Im.shape,order='F')
eIm1=Im[ind]
我得到了与matlab相同的维度和索引值。然而,对于最后一行eIm1=Im[ind]。我得到以下错误。
IndexError: index 962 is out of bounds for axis 0 with size 961
变量ind的维数为:
ind=1x211420 double ; the matrix in python looks like this : [[962 962 962 962 962 962....]]
我如何编写eIm1=Im[ind]语法来解决错误。先谢谢你了。
1条答案
按热度按时间qni6mghb1#
有多个问题,主题令人困惑...
首先修复输入矩阵-为了测试,值应该覆盖更大的范围(特别是索引):
我们最好保存输入,以便在MATLAB和Python中使用相同的输入:
sub2ind
函数的参数顺序是y
,x
:将
eIm1 = Im(sub2ind(size(Im), floor(re_x0'+1), floor(re_y0'+1)));
替换为:注意事项:
这部分只是为了遵循惯例(使事情不那么混乱)。
在Python代码中,读取
input_data.mat
到NumPy数组,并整形:使用
np.ravel_multi_index
时,建议使用NumPy约定行优先(C样式)。在Python中使用NumPy约定似乎是合适的,因为我们正在使用NumPy。
order='F'
dims=(b1, a1)
-第一个维度应用X(水平)轴,第二个维度应用Y(垂直)轴。我们不能在Python中使用线性索引
eIm1 = Im[ind]
。我们必须将2D数组表示为“长”1D数组。
我们可以使用
ravel()
方法:eIm1 = Im.ravel()[ind]
。由于MATLAB数组是转置的(
eIm1'
):Im1 = reshape(eIm1', size(Im));
,我们还必须在ravel()
之前转置Im
:比较Python输出和MATLAB输出:
更新MATLAB代码:
Python代码更新: