Python:将数组索引附加到列表(.append)

时间:2014-04-06 00:50:23

标签: python arrays numpy

提前感谢您的帮助。我在将数组索引附加到列表时遇到问题。我有一个数组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

2 个答案:

答案 0 :(得分:1)

您在counterStack = [(1366, 1264)]循环的每次迭代中设置for,但堆栈仅设置为基本索引一次。

counterStack = [(1366, 1264)]移到stack = [(1366, 1264)]行的正下方,您应该看到自己想要的内容。

同样如9000所述,(x, y)表示由xy组成的2元组。 [x, y]是长度为list的长度2.您可以将结果与索引值进行单独比较:(x, y)[1]将返回y[x, y][1]将返回y同样。

但使用if ... not in counterStack会将2-tuple中的每个(xx, yy) counterStacklist [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元组来表示一个位置。元组是不可变的和固定的大小,这使得坐标向量完全有意义。