#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2005
    Posts
    4
    Rep Power
    0

    Dealing with imaginary numbers


    So I've generated a 2D array with real and imaginary numbers in it. Something like this (this is just an example I'm really dealing with 2D arrays greater than 50x50). The following code uses the for loops to move the values in the array to new positions. The imaginary part is lost when the array is passed through the for loops. I have yet to figure out why. I've tried intializing 'temp' in different ways but have had no luck. Any help is greatly appreciated.
    fd

    Code:
    from numarray import *
    
    temp = zeros([6,6])
    
    A = array([[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]])
    
    A = A + 2j  #makes A complex
    
    #used to define limits on for loops below
    nx = len(A)
    ny = len(A)
    kx = nx/2
    ky = ny/2
    
    print A  #just to see if everything looks all right
    
    #reassigns values in quadrant 2 to 4 and quadrant 3 to 1
    for j in arange(kx-1):
        for i in arange(kx-1):
            temp[i+kx+1,j+kx+1] = A[i,j]
        for i in arange(kx-1,ny):
            temp[i-kx+1,j-kx+1] = A[i,j]
            
    #reassigns values in quadrant 4 to 2 and quadrant 1 to 3
    for j in arange(kx-1,ny):
        for i in arange(kx-1):
            temp[i-kx+1,j-kx+1] = A[i,j]
        for i in arange(kx-1,ny):
            temp[i-kx+1,j-kx+1] = A[i,j] 
    
    
    print temp
  2. #2
  3. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2005
    Posts
    37
    Rep Power
    10
    You've got a couple things going on...
    first, you've messed up your indicies. check your results over.

    second, when you initialize temp, you make it an int array. you need to declare the type to be comlex, like this:

    Code:
    tmp = array(zeros([6,6]),type=Complex64)
    Also, there are much easier ways to swap the contents other than for loops. check out the numarray docs:

    numarray docs in pdf

    I'm not an expert at numarray by any means, but here's how I'd do it. There are probably cleaner ways without so many temp variables, but this gets the point across...
    note: only works with square arrays.


    Code:
    from numarray import *
    
    temp = zeros([6,6])
    
    A = array([[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]])
    
    A = A + 2j  #makes A complex
    
    #used to define limits on for loops below
    n = len(A)
    
    print A  #just to see if everything looks all right
    
    #get the quadrants:
    quad1 = A[0:n/2,0:n/2]
    quad2 = A[0:n/2,n/2:n]
    quad3 = A[n/2:n,n/2:n]
    quad4 = A[n/2:n,0:n/2]
    
    top = concatenate((quad3,quad4),1)
    bottom = concatenate((quad2,quad1),1)
    temp = concatenate((top,bottom))
    
    print temp
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2005
    Posts
    4
    Rep Power
    0
    Thanks. I messed up my description of the swap. It's not a straight swap of the four quadrants. But, thanks to your advice on numarray this is what the final correct code looks like (without having to intialize it to Complex64). Now I'll try to extend it out to any size matrix. I doubt I'll be lucky enough to deal with only square arrays.

    Cheers,
    fd

    Code:
    from numarray import *
    
    temp = zeros([6,6])
    
    A = array([[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]])
    
    A = A + 2j  #makes A complex
    
    #used to define limits on for loops below
    n = len(A)
    
    print A, "\n"  #just to see if everything looks all right
    
    #get the quadrants:
    quad1 = A[0:((n/2)-1),((n/2)-1):n]
    quad2 = A[0:((n/2)-1),0:((n/2)-1)]
    quad3 = A[((n/2)-1):n,0:((n/2)-1)]
    quad4 = A[((n/2)-1):n,((n/2)-1):n]
    
    top = concatenate((quad4,quad3),1)
    bottom = concatenate((quad1,quad2),1)
    temp = concatenate((top,bottom))
    
    print temp

IMN logo majestic logo threadwatch logo seochat tools logo