MATLAB到Python转换数组

时间:2016-01-22 07:09:30

标签: python arrays matlab

我在MATLAB中有一些代码,我正在尝试将其转换为python。我对python知之甚少,所以这是一个挑战。

这是MATLAB代码:

xm_row = -(Nx-1)/2.0+0.5:(Nx-1)/2.0-0.5;
xm = xm_row(ones(Ny-1, 1), :);
ym_col = (-(Ny-1)/2.0+0.5:(Ny-1)/2.0-0.5)';  
ym = ym_col(:,ones(Nx-1,1));

这是我尝试在python中做同样事情的非常粗略的尝试:

 for x in range (L-1):
     for y in range (L-1):
         xm_row = x[((x-1)/2.0+0.5):((x-1)/2.0-.5)]
         xm = xm_row[(ones(y-1,1)),:]
         ym_column = transposey[(-(y-1)/2.0+0.5):((y-1)/2.0-.5)]
         ym = ym_column[:,ones(x-1,1)]

在我的python代码中,L是我循环的数组的大小。 当我尝试在python中运行它时,我得到错误:

 'int' object has no attribute '__getitem__' 

在这一行:

 xm_row = x[((x-1)/2.0+0.5):((x-1)/2.0-.5)]

感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

在MATLAB中,您可以使用meshgrid以更简单的方式实现它,就像这样 -

Nx = 5;
Ny = 7;

xm_row = -(Nx-1)/2.0+0.5:(Nx-1)/2.0-0.5;
ym_col = (-(Ny-1)/2.0+0.5:(Ny-1)/2.0-0.5)';  
[xm_out,ym_out] = meshgrid(xm_row,ym_col)

让我们将此网格版本与原始验证代码进行比较 -

>> Nx = 5;
>> Ny = 7;
>> xm_row = -(Nx-1)/2.0+0.5:(Nx-1)/2.0-0.5;
>> ym_col = (-(Ny-1)/2.0+0.5:(Ny-1)/2.0-0.5)'; 
>> xm = xm_row(ones(Ny-1, 1), :)
xm =
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
>> ym = ym_col(:,ones(Nx-1,1))
ym =
         -2.5         -2.5         -2.5         -2.5
         -1.5         -1.5         -1.5         -1.5
         -0.5         -0.5         -0.5         -0.5
          0.5          0.5          0.5          0.5
          1.5          1.5          1.5          1.5
          2.5          2.5          2.5          2.5
>> [xm_out,ym_out] = meshgrid(xm_row,ym_col)
xm_out =
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
         -1.5         -0.5          0.5          1.5
ym_out =
         -2.5         -2.5         -2.5         -2.5
         -1.5         -1.5         -1.5         -1.5
         -0.5         -0.5         -0.5         -0.5
          0.5          0.5          0.5          0.5
          1.5          1.5          1.5          1.5
          2.5          2.5          2.5          2.5

现在,从MATLAB过渡到Python在NumPy中有一个更简单的介质,因为它托管了许多来自MATLAB的对应物,用于在Python环境中使用。对于我们的情况,我们有一个NumPy版本的meshgrid,这使它只是一个直接的移植,如下所示 -

import numpy as np # Import NumPy module

Nx = 5;
Ny = 7;

# Use np.arange that is a colon counterpart in NumPy/Python
xm_row = np.arange(-(Nx-1)/2.0+0.5,(Nx-1)/2.0-0.5+1)
ym_col = np.arange(-(Ny-1)/2.0+0.5,(Ny-1)/2.0-0.5+1)

# Use meshgrid just like in MATLAB
xm,ym = np.meshgrid(xm_row,ym_col)

输出 -

In [28]: xm
Out[28]: 
array([[-1.5, -0.5,  0.5,  1.5],
       [-1.5, -0.5,  0.5,  1.5],
       [-1.5, -0.5,  0.5,  1.5],
       [-1.5, -0.5,  0.5,  1.5],
       [-1.5, -0.5,  0.5,  1.5],
       [-1.5, -0.5,  0.5,  1.5]])

In [29]: ym
Out[29]: 
array([[-2.5, -2.5, -2.5, -2.5],
       [-1.5, -1.5, -1.5, -1.5],
       [-0.5, -0.5, -0.5, -0.5],
       [ 0.5,  0.5,  0.5,  0.5],
       [ 1.5,  1.5,  1.5,  1.5],
       [ 2.5,  2.5,  2.5,  2.5]])

此外,请注意,在{2}的第二个参数末尾添加了+1,因为np.arange在创建元素范围时排除了第二个参数元素。例如,如果我们想要创建从np.arange3的一系列元素,我们将需要执行10,如下所示 -

np.arange(3,10+1)