2017-09-05 73 views
0

我想要做的是在圖像的隨機行中找到局部最小值(完成),然後在該列表中找到局部最小值。
我已經寫了下面的代碼使用函數來找到一個1-d陣列的最低值:試圖理解遞歸尋找最小值

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變量。

問題出現在你的第二遍。您已在第一次迭代中返回values,該列表不是新列表,而是對全局變量的引用,該變量仍包含您的所有舊值。

相反,您應該將values = []移動到函數的內部,並在最後返回它。這樣,每次調用時,您都會得到一個新列表,並且不會改變同一個全局列表。