【问题标题】:Array operations/ slicing in python from matlab来自matlab的python中的数组操作/切片
【发布时间】:2013-08-03 04:40:46
【问题描述】:

我有 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代码给了我不同的结果。

谁能告诉我怎么了?

谢谢,

【问题讨论】:

    标签: python matlab multidimensional-array slice


    【解决方案1】:

    逐个检查表明您的范围中有一些错误。我认为您对 python 中的数组有一些误解。

    1. 与数组的第一个元素是array[1] 的matlab 不同,在python 中数组的第一个元素是array[0]
    2. 数组切片语法是array[start:stop:step],因此要从数组中的第五个元素开始到末尾,您可以使用array[4::2]

    只要逐条浏览,你就会发现问题。例如,第二个等式右边的第一个元素应该是:

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

    请注意,这里不需要第二个冒号,因为您的 step 是 1,如果您想更改步骤,则该步骤在最后。

    【讨论】:

    • 很高兴我能帮上忙。我通常不会为此烦恼某人,但既然你似乎在这里,我会指出你应该接受对你有用的答案,这样人们就不会一直回到你的问题来给出答案。
    【解决方案2】:

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

    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::]
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2021-11-09
      相关资源
      最近更新 更多