1

I have some code in MATLAB that I'm trying to convert into python. I know very little about python, so this is turning out to be a bit of a challenge.

Here's the MATLAB code:

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

And here is my very rough attempt at trying to do the same thing in 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)]

In my python code, L is the size of the array I am looping across. When I try to run it in python, I get there error:

 'int' object has no attribute '__getitem__' 

at the line:

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

Any help is appreciated!

2
  • x is integer - first value from list 0..L-1 Commented Jan 22, 2016 at 7:15
  • x[ ... ] - this way you expect that x is a list (array) but x is single number. Commented Jan 22, 2016 at 7:19

1 Answer 1

3

In MATLAB, you can implement that in a simpler way with meshgrid, like so -

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)

Let's compare this meshgrid version with the original code for verification -

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

Now, transitioning from MATLAB to Python has a simpler medium in NumPy, as it hosts many counterparts from MATLAB for use in a Python environment. For our case, we have a NumPy version of meshgrid and that makes it just a straight-forward porting as listed below -

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)

Output -

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

Also, please notice that +1 was being added at the end of the second argument to np.arange in both cases, as np.arange excludes the second argument element when creating the range of elements. As an example, if we want to create a range of elements from 3 to 10, we would be required to do np.arange(3,10+1) as shown below -

In [32]: np.arange(3,10+1)
Out[32]: array([ 3,  4,  5,  6,  7,  8,  9, 10])
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.