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?
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()
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments