我尝试做的是在图像的随机行中找到局部最小值(完成),然后在该列表中找到局部最小值。
我已经编写了以下代码来使用函数来查找一维数组中的最小值:
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]]
如何更改代码以产生我想要的输出?
注意:可能有更简单的方法可以做到这一点,但这种方式最适合我需要做的其他处理,所以我想理解为什么这个代码特别没有按照我的预期行事。
答案 0 :(得分:1)
您通过引用全局变量values
来跟踪最小值。在您第一次通过时,当您使用find_minima
与row
通话时,在每次迭代时,您会附加到全局values
变量。
问题出现在你的第二次通过。您在第一次迭代中返回values
,这不是新列表,而是对全局变量的引用,该变量仍包含所有旧值。
相反,您应该将values = []
移动到函数内部,并在结尾处返回它。这样,在每次调用时,您都会获得一个新列表,并且不会改变相同的全局列表。