来自matlab的python中的数组操作/切片

时间:2013-08-02 02:44:45

标签: python matlab multidimensional-array slice

我有matlab数组操作如下:

[M,N]=size(I) ;
J = zeros(2*M,2*N) ;

J(1:2:end,1:2:end) = I ;

J(2:2:end-1,2:2:end-1) = 0.25*I(1:end-1,1:end-1) + 0.25*I(2:end,1:end-1) + 0.25*I(1:end-1,2:end) + 0.25*I(2:end,2:end) ;

J(2:2:end-1,1:2:end) = 0.5*I(1:end-1,:) + 0.5*I(2:end,:) ;
J(1:2:end,2:2:end-1) = 0.5*I(:,1:end-1) + 0.5*I(:,2:end) ;

我正在尝试在python中重写相同的操作,我想出了以下内容:

J=numpy.zeros((2*M,2*N))

J[::2,::2] = I ;

J[2:-1:2,2:-1:2] = 0.25*I[1::-1,1::-1] + 0.25*I[2::,1::-1] + 0.25*I[1::-1,2::] + 0.25*I[2::,2::] 

J[2:-1:2,1::2] = 0.5*I[1::-1,] + 0.5*I[2::,]

J[::2,2:-1:2] = 0.5*I[:,1::-1] + 0.5*I[:,2::]

然而python代码给了我不同的结果。

谁能告诉我出了什么问题?

谢谢,

2 个答案:

答案 0 :(得分:5)

逐条逐步显示您的范围内有一些错误。我认为你在python中误解了一些关于数组的东西。

  1. 与数组的第一个元素为array[1]的matlab不同,在python中,数组的第一个元素是array[0]
  2. 数组切片语法为array[start:stop:step],因此要将每个从数组中第五个元素开始的第二个元素放到最后,您需要array[4::2]
  3. 只要仔细阅读,您就会发现问题。例如,第二个等式右边的第一个元素应为:

    0.25*I[0:-1, 0:-1]
    

    请注意,由于您的step为1,因此您不需要第二个冒号,如果您想要更改步骤,则步骤将持续。

答案 1 :(得分:0)

所以这是正确的移植代码:

J[::2,::2] = I ;

J[1:-1:2,2:-1:2] = 0.25*I[0:-1,0:-1] + 0.25*I[1::,0:-1] + 0.25*I[0:-1,1::] + 0.25*I[1::,1::] 

J[1:-1:2,0::2] = 0.5*I[0:-1,] + 0.5*I[1::,]

J[0::2,1:-1:2] = 0.5*I[:,0:-1] + 0.5*I[:,1::]