0

I have a function in python that uses for loops to generate an array;

from pylab import *

r0 = 3.
radius = 3*r0
signal_centre_i = randint(radius,100-radius)
signal_centre_j = randint(radius,100-radius)
bg_score = 30
SN_ratio = 1.
S0 = 10.
signal_score = 0
def generate_signal():
    signal_array = zeros((101,101))
    for i in range(101):
        for j in range(101):
            r = ((i-signal_centre_i)**2 + (j-signal_centre_j)**2)**0.5
            signal_array[i,j] = signal_array[i,j] + S0*(1+((r/r0)**2))**-1.5
    signal_score = 0
    for i in range(101):
        for j in range(101):
            if ((i - signal_centre_i)**2 + (j-signal_centre_j)**2)**0.5 <= radius:
                signal_score = signal_array[i,j] + signal_score
            elif (((i - signal_centre_i)**2 + (j-signal_centre_j)**2)**0.5 <= radius +1) and ((i - signal_centre_i)**2 + (j-signal_centre_j)**2)**0.5 > radius:
                signal_array[i,j] = 10
    return signal_score

generate_signal()

while (((signal_score/bg_score)**0.5) < SN_ratio - SN_ratio/2) or (((signal_score/bg_score)**0.5) > SN_ratio + SN_ratio/2):
    if (signal_score/bg_score)**0.5 > SN_ratio:
        print "Calculated SN: "+str((signal_score/bg_score)**0.5)
        S0 = S0 - S0/10
        print "S0: "+str(S0)
        print "Signal score: "+str(signal_score)
        generate_signal()
    elif (signal_score/bg_score)**0.5 < SN_ratio:
        print "Calculated SN: "+str((signal_score/bg_score)**0.5)
        S0 = S0 + S0/10
        print "S0: "+str(S0)
        print "Signal score: " +str(signal_score)
        generate_signal()

I'm really sorry for the wall of code - if there's a better way to format it then please let me know.

The code takes a 101x101 array and places a random 'signal' on it (so when you use the imshow() function, you get a bright spot). However, when I run this code, the signal score does not update - I expect it to print the total value of the array within a circle around the centre of the source, and then update the equation so that the value tends towards a predetermined value. However, this does not happen, and signal score stays at zero.

I have used loops of the form

for i in range(101):
    for j in range(101):
        if ((i - centre_i)**2 + (j - centre_j)**2)**0.5 <= radius:
             score = score + array[i,j]

many times in the past for the same purpose, with no problems.

What am I doing wrong?

1
  • I've corrected the indentation error Commented Aug 14, 2017 at 14:19

1 Answer 1

2

You ignore the return value from your generate_signal function every time you call it. You need to assign it to the signal_score variable in the module scope.

signal_score = generate_signal()
Sign up to request clarification or add additional context in comments.

1 Comment

Obvious once you know it... Exactly the solution I was looking for. Thank you!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.