2017-09-03 2 views
0

ich ein kleines Programm geschrieben habe, zu tun, die folgenden:Passing Variablen in und von Funktionen aus

  • inspizieren ein Bild
  • eine Reihe zufällig wählt aus dem Bild
  • Plot der Pixelwert entlang dass Zeile
  • eine list der lokalen Minima machen in dieser Reihe

und ich versuche, es in eine Funktion zu machen, damit ich tun Das gleiche gilt für 10 Zeilen, damit ich die Pixelwerte aller dieser Zeilen darstellen kann, ohne das Programm 10 Mal ausführen zu müssen.
Der Code sieht wie folgt aus:

from astropy.io import fits 
import matplotlib.pyplot as plt 
import numpy as np 

hdulist = fits.open('xbulge-w1.fits') # Open FITS file as image 
w1data = hdulist[0].data 

height = w1data.shape[0] # Inspect height of image 
width = w1data.shape[1] 

def plot_envelope(image, image_height): 
    index = np.random.randint(0, height/2) # Select random number in upper half 
    row = w1data[index] # Look at row number 

    local_minima = [] 

    # Find local minimum, and add to list of minimum-valued pixels 
    for i in range(1, width-1): 
     if w1data[index][i-1] > w1data[index][i]: 
      if w1data[index][i+1] > w1data[index][i]: 
       local_minima.append(w1data[index][i]) 
     else: 
      continue 
    return (local_minima, row, index) 

plot_envelope(w1data, height) 

x1 = range(width) 
plt.plot(x1, row, color = 'r', linewidth = 0.5) 
plt.title('Local envelope for row ' + str(index)) 
plt.xlabel('Position') 
plt.ylabel('Pixel value') 
plt.show() 

Es funktioniert gut, wenn ich (dh keine Funktionsdefinition verwenden, wenn die Erklärungen von index, row und local_minima und die verschachtelten for Schleifen sind im main Teil das Programm). Bei der angegebenen Funktionsdefinition wird ein Fehler NameError: name 'local_minima' is not defined zurückgegeben.
Da ich diese Variablen aus der Funktion übergebe, sollte ich nicht in der Lage sein, sie im Rest des Programms zu verwenden?
Fehle ich etwas über lokale und globale Variablen?

+0

Woher bekommen Sie den 'NameError'? Ich sehe nicht, wie der gepostete Code einen 'NameError' für' local_minima' zurückgeben würde, es sei denn, es ist in einem anderen Teil des Codes, den Sie nicht angezeigt haben. – SethMMorton

Antwort

0

Wenn Sie plot_envelope(w1data, height) aufrufen, sagen Sie der Funktion, w1data und height Bild und image_höhe zuzuweisen. Innerhalb der Funktion sollten Sie die w1data mit der Dummy-Variablen image manipulieren (w1data für Bild innerhalb der Funktion ändern), wobei der Gültigkeitsbereich nur innerhalb der Funktion ist. Als nächstes sollten Sie das Ergebnis der Funktion (return) in einer Variablen erhalten: envelope = plot_envelope(w1data, height) Dann local_minima = envelope[0], row = envelope[1], index = envelope[2].

+1

Ein alternativer Aufruf wäre 'local_minima, row, index = plot_envelope (w1data, Höhe) '. – SethMMorton

+0

Yah !!! Viel besser in der Tat @SethMMorton;) – Tico