2016-01-22 100 views
1

我在MATLAB中有一些代碼,我試圖轉換成python。我對python知之甚少,所以這是一個挑戰。MATLAB to Python Conversion Arrays

這裏的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)] 

任何幫助表示讚賞!

+0

'x'是整數 - 第一值從列表'0..L -1' – furas

+0

'x [''''''''''''這種方式您希望'x'是一個列表(數組),但'x'是單個數字。 – furas

回答

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) 

讓我們比較這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 = 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環境。對於我們的情況,我們有meshgrid的NumPy的版本,這使得它只是一個直接的移植下面所列 -

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

而且,請注意,目前正在加入+1在這兩種情況下np.arange的第二個參數的末尾,因爲np.arange排除了創建元素範圍時的第二個參數元素。作爲一個例子,如果我們想創建一個範圍從3元素10的,我們將需要做np.arange(3,10+1)如下 -

In [32]: np.arange(3,10+1) 
Out[32]: array([ 3, 4, 5, 6, 7, 8, 9, 10])