2017-09-05 5 views
0

Was ich versuche zu tun, ist das lokale Minima in einer zufälligen Reihe eines Bildes zu finden (fertig), dann finden Sie die lokalen Minima in dieser Liste.
Ich habe den folgenden Code geschrieben, um eine Funktion zu verwenden, um die Minimalwerte in einer 1-d-Array zu finden:Versuchen, rekursiv zu verstehen, Mindestwert zu finden

import numpy as np 
values = [] 
pixels = [] 

def find_minima(array): 
    ''' 
    Takes a 1-d array as an argument, and returns a list of the 
    minimum values of the array, and the pixels at which the 
    minima occur 
    ''' 
# Find local minimum, and add to list of minimum-valued pixels 
    for i in range(1, len(array)-1): 
     if array[i-1] > array[i]: 
      if array[i+1] > array[i]: 
       values.append(array[i]) 
       pixels.append([i]) 
     else: 
      continue 
    return (values, pixels) 


# Generate a random image 
np.random.seed(seed=128) 
side = 15 
img = np.random.rand(side, side) 

height = img.shape[0]    # Inspect height of image 

# Select row at random 
index = np.random.randint(0, height) 
row = img[index] 


minimum_values, minimum_pixels = find_minima(row) 
global_minimum_values, global_minimum_pixels = find_minima(minimum_values) 

Das Programm funktioniert gut, bis ich versuche, die Liste der minimum_values bereits gefunden passieren, zurück in die Funktion, um die Minima in dieser Liste zu finden.
Ich erwarte, dass die Variablenwerte wäre:

minimum_values = [0.2274, 0.6910, 0.2715, 0.3075] 
minimum_pixels = [[1], [3], [7], [11]] 
global_minimum_values = [0.2715] 
global_minimum_pixels = [2] 

sondern, heftet das Programm nur die globalen Minima auf der ursprünglichen Liste, so dass sie alle gleich:

minimum_values = [0.2274, 0.6910, 0.2715, 0.3075, 0.2715] 
minimum_pixels = [[1], [3], [7], [11], [2]] 
global_minimum_values = [0.2274, 0.6910, 0.2715, 0.3075, 0.2715] 
global_minimum_pixels = [[1], [3], [7], [11], [2]] 

Wie kann ich den Code ändern, um meine gewünschte Ausgabe zu produzieren?
Hinweis: Es gibt wahrscheinlich einfachere Möglichkeiten, dies zu tun, aber dieser Weg passt am besten zu den anderen Verarbeitungen, die ich tun muss. Daher möchte ich verstehen, warum sich dieser Code nicht so verhält, wie ich es erwarte.

Antwort

1

Sie verfolgen Ihre Minima anhand der globalen Variablen values. Wenn Sie beim ersten Durchlauf find_minima mit row aufrufen, hängen Sie bei jeder Iteration an die globale Variable values an.

Das Problem kommt auf Ihren zweiten Durchlauf durch. Sie haben in der ersten Iteration values zurückgegeben. Dies ist keine neue Liste, sondern ein Verweis auf die globale Variable, in der noch alle Ihre alten Werte enthalten sind.

Stattdessen sollten Sie values = [] in das Innere Ihrer Funktion verschieben und am Ende zurückgeben. Auf diese Weise erhalten Sie bei jedem Anruf eine neue Liste und mutieren nicht dieselbe globale Liste.

Verwandte Themen