提前感谢您的帮助。我在将数组索引附加到列表时遇到问题。我有一个数组counterStack,其中包含起点(1366,1264)我在该起点上运行邻域搜索,并且对于满足条件集的每个新索引,索引应该附加到counterStack。奇怪的是索引被正确地附加到列表stack
,但不是列表counterStack
。
这是因为我的if语句(if ([nx, ny] not in counterStack):
)吗?我知道它进入了if语句,因为计数器计数在每次迭代时都会加1。指数将被添加到堆栈两次。所以我设置counterStack只考虑一次索引,所以我可以限制整体编辑的像素。在运行结束时,应该有121个indeces附加到counterStack。
这是结果的一个例子:
count = 1
[(1366, 1264), (1365, 1263)]
count = 2
[(1366, 1264), (1365, 1264)]
count = 3
[(1366, 1264), (1365, 1265)]
count = 4
[(1366, 1264), (1366, 1265)]
count = 5
[(1366, 1264), (1367, 1265)]
count = 6
[(1366, 1264), (1367, 1264)]
count = 7
[(1366, 1264), (1367, 1263)]
count = 8
[(1366, 1264), (1366, 1263)]
count = 9
[(1366, 1264), (1365, 1262)]
以下是我的一些代码:
neighbors = [(-1,-1), (-1,0), (-1,1), (0,1), (1,1), (1,0), (1,-1), (0,-1)]
mask = np.zeros_like(dem_arr, dtype = bool)
stack = [(1366, 1264)] # push start coordinate on stack
if (dem_arr[1366, 1264] > -100):
count = 0
while count <= 121:
x, y = stack.pop()
mask[x, y] = True
for dx, dy in neighbors:
nx, ny = x + dx, y + dy
if (0 <= nx < dem_arr.shape[0] and 0 <= ny < dem_arr.shape[1] and dem_arr[x, y] > -100 and dem_arr[nx, ny] > -100 and not mask[nx, ny] and abs(dem_arr[nx, ny] - dem_arr[x, y]) <= 5): #set elevation differnce
stack.append((nx, ny)) #if point is selected (true) array position gets added to stack and process runs over again
counterStack = [(1366, 1264)]
if ([nx, ny] not in counterStack):
counterStack.append((nx, ny))
dem_copy[(nx, ny)] = 8888
#dem_copy[randx, randy] = 8888
count += 1
print 'count = ', count
print counterStack
else:
print 'Point chosen has no data'
randx = random.randint(0, row-1)
randy = random.randint(0, col-1)
再次感谢您的帮助!
-R
答案 0 :(得分:1)
您在counterStack = [(1366, 1264)]
循环的每次迭代中设置for
,但堆栈仅设置为基本索引一次。
将counterStack = [(1366, 1264)]
移到stack = [(1366, 1264)]
行的正下方,您应该看到自己想要的内容。
同样如9000所述,(x, y)
表示由x
和y
组成的2元组。 [x, y]
是长度为list
的长度2.您可以将结果与索引值进行单独比较:(x, y)[1]
将返回y
而[x, y][1]
将返回y
同样。
但使用if ... not in counterStack
会将2-tuple
中的每个(xx, yy)
counterStack
与list
[nx, ny]
进行比较,并且它永远不会返回False
,因为counterStack
永远不会有list
。
答案 1 :(得分:0)
这是你的问题:
counterStack = [(1366, 1264)] # counterStack contains a tuple
if ([nx, ny] not in counterStack): # counterStack is checked for a list
counterStack.append((nx, ny)) # counterStack adds another tuple
请注意,[1, 2]
和(1, 2)
完全不同。它们并不相同,因此in
不会达到您所期望的效果。
我假设你统一使用2元组来表示一个位置。元组是不可变的和固定的大小,这使得坐标向量完全有意义。