2017-09-05 6 views
0

私がやっていることは、画像のランダムな行でローカルミニマムを見つけて、そのリストのローカルミニマムを見つけることです。
私は1次元配列で最小値を見つけるために、機能を使用するには、次のコードを書いている:最小値を見つけることを再帰的に理解しようとする

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) 

プログラムは、私はすでに見つかっminimum_valuesのリストを渡すことを試みるアップまで、正常に動作しますそのリストにある最小値を見つけるための関数に戻ります。私は、変数の値がになることを期待してい

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] 

が、それらはすべて同じだように、代わりに、プログラムは単に、元のリストにグローバル最小値を鋲:

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]] 

希望の出力を生成するためにコードを変更するにはどうすればよいですか?
注:おそらくこれを行う簡単な方法がありますが、この方法は他の処理に最も適しているため、このコードが特に期待したとおりに動作しない理由を理解したいと思います。

答えて

1

グローバル変数valuesを参照して最小値をトラッキングしています。初回通過時に、find_minimarowと呼び出すと、各繰り返しで、グローバルvalues変数に追加されます。

問題は2回目の通過時に発生します。最初の繰り返しではvaluesが返されました。これは新しいリストではなく、グローバル変数への参照です。グローバル変数には以前の値がすべて含まれています。

代わりにvalues = []を関数の内部に移動し、最後にそれを戻す必要があります。こうすることで、各呼び出しで新しいリストが取得され、同じグローバルリストが変更されることはありません。

関連する問題