我在Python中计算求和面积表(https://en.wikipedia.org/wiki/Summed_area_table)时遇到问题。最明显的算法是在引用已经编写好的元素的同时就地更新列表元素……但是关于就地更新的一些内容似乎让Python感到困惑。在
下面是一些示例代码:def compute_summed_area_table(image):
# image is a 2-dimensional array containing ints or floats, with at least 1 element.
height = len(image)
width = len(image[0])
new_image = [([0.0] * width)] * height # Create an empty summed area table
for row in range(0, height):
for col in range(0, width):
if (row > 0) and (col > 0):
new_image[row][col] = image[row][col] + \
new_image[row][col - 1] + new_image[row - 1][col] - \
new_image[row - 1][col - 1]
elif row > 0:
new_image[row][col] = image[row][col] + new_image[row - 1][col]
elif col > 0:
new_image[row][col] = image[row][col] + new_image[row][col - 1]
else:
new_image[row][col] = image[row][col]
# Note that two-pass code gives the same kind of results, e.g.:
# for row in range(0, height):
# for col in range(0, width):
# if col > 0:
# new_image[row][col] = image[row][col] + new_image[row][col - 1]
# else:
# new_image[row][col] = image[row][col]
# for row in range(0, height):
# for col in range(0, height):
# if row > 0:
# new_image[row][col] += new_image[row - 1][col]
return new_image
small_image = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]
small_sat = compute_summed_area_table(small_image)
print(small_sat)
根据我自己的手动计算(可能出错),此测试代码应给出如下内容:
[[1,3,6,10,15],[7,16,27,40,55],[18,39,63,90,120],[34,72,114,160,210],[55,115,180,250,325]]
相反,它给出了:
[[55,61,68,76,85],[55,61,68,76,85],[55,61,68,76,85],[55,61,68,76,85],[55,61,68,76,85]]
很明显,在每一行迭代中更新每一行,但我不确定确切的原因或方式。有人知道到底出了什么问题吗?有没有其他方法可以进行就地更新?如果没有,你会如何处理?在