试图理解递归找到最小值

时间:2017-09-05 23:48:40

标签: python arrays for-loop

我尝试做的是在图像的随机行中找到局部最小值(完成),然后在该列表中找到局部最小值。
我已经编写了以下代码来使用函数来查找一维数组中的最小值:

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 个答案:

答案 0 :(得分:1)

您通过引用全局变量values来跟踪最小值。在您第一次通过时,当您使用find_minimarow通话时,在每次迭代时,您会附加到全局values变量。

问题出现在你的第二次通过。您在第一次迭代中返回values,这不是新列表,而是对全局变量的引用,该变量仍包含所有旧值。

相反,您应该将values = []移动到函数内部,并在结尾处返回它。这样,在每次调用时,您都会获得一个新列表,并且不会改变相同的全局列表。