python 查找二维数组的相邻元素

我想要一个函数neighbors (array, radius, x, y),传递一个数组(在这个里面找邻居),一个半径,还有要找邻居的那个点的坐标,返回相应的一个包含所有邻居的数组。

#coding=utf-8
'''
Created on 2014-3-21

@author: Neo
'''

def PrintList(array):#输出数组
    for i in range(array.__len__()):
        print array[i]

def SetList(array):#给数组赋值
    row = 11
    col = 11
    for i in range(array.__len__()):
        for j in range(array[i].__len__()):
            array[i][j] = row
            row += 10
        col += 1
        row = col
        
    print "赋值后的二维数组:"
    PrintList(array) 
    
    return array   
        
def InitList(x, y):
    #初始化一个二维数组
    array = [([0] * y) for i in range(x)]
  
    return array
    
def GetListByCoord(array, radius, x, y):
    #根据半径来确定数组的行数和列数
    row_col = 2 * radius + 1
    #初始化结果数组
    result = InitList(row_col, row_col)
    #获取传入的array的行数和列数
    arrayRow, arrayCol = len(array), len(array[0])
    #坐标x、y的值即为结果数组的中心,依此为偏移
    for i in range(result.__len__()):
        for j in range(result.__len__()):
            if (i+x-radius < 0 or j+y-radius < 0 or 
            i+x-radius >= arrayRow or j+y-radius >= arrayCol):
                result[i][j] = 0
            else:
                result[i][j] = array[i+x-radius][j+y-radius]
    
    #打印结果
    print "结果为:"
    PrintList(result)

if __name__ == '__main__':
    #数组7列6行
    array = SetList(InitList(6,7))
    GetListByCoord(array, 1, 3, 3)
    GetListByCoord(array, 2, 3, 3)
    GetListByCoord(array, 2, 0, 0)
    GetListByCoord(array, 2, 0, 6)
    GetListByCoord(array, 2, 5, 0)
    GetListByCoord(array, 2, 5, 6)

运行结果为:

---------------------------------------------------------------------------------------------

赋值后的二维数组:

[11, 21, 31, 41, 51, 61, 71]

[12, 22, 32, 42, 52, 62, 72]

[13, 23, 33, 43, 53, 63, 73]

[14, 24, 34, 44, 54, 64, 74]

[15, 25, 35, 45, 55, 65, 75]

[16, 26, 36, 46, 56, 66, 76]

结果为:

[33, 43, 53]

[34, 44, 54]

[35, 45, 55]

结果为:

[22, 32, 42, 52, 62]

[23, 33, 43, 53, 63]

[24, 34, 44, 54, 64]

[25, 35, 45, 55, 65]

[26, 36, 46, 56, 66]

结果为:

[0, 0, 0, 0, 0]

[0, 0, 0, 0, 0]

[0, 0, 11, 21, 31]

[0, 0, 12, 22, 32]

[0, 0, 13, 23, 33]

结果为:

[0, 0, 0, 0, 0]

[0, 0, 0, 0, 0]

[51, 61, 71, 0, 0]

[52, 62, 72, 0, 0]

[53, 63, 73, 0, 0]

结果为:

[0, 0, 14, 24, 34]

[0, 0, 15, 25, 35]

[0, 0, 16, 26, 36]

[0, 0, 0, 0, 0]

[0, 0, 0, 0, 0]

结果为:

[54, 64, 74, 0, 0]

[55, 65, 75, 0, 0]

[56, 66, 76, 0, 0]

[0, 0, 0, 0, 0]

[0, 0, 0, 0, 0]

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-21
#!/usr/bin/env python
# coding: utf-8


def neighbors (array, radius, x, y):
    arrayRsize, arrayCsize = len(array), len(array[0])
    pos = [[(n+x, i+y) for n in xrange(-1*radius, radius+1)]
        for i in xrange(-1*radius, radius+1)
        ]

    def _getNum(rid, cid):
        return 0 if (rid < 0 
                or cid < 0
                or arrayRsize <= cid
                or arrayCsize <= rid) else array[rid][cid]
    return [[_getNum(rid, cid) for rid, cid in row] for row in pos]


arr = [
    [11, 21, 31, 41, 51, 61, 71],
    [12, 22, 32, 42, 52, 62, 72],
    [13, 23, 33, 43, 53, 63, 73],
    [14, 24, 34, 44, 54, 64, 74],
    [15, 25, 35, 45, 55, 65, 75],
    [16, 26, 36, 46, 56, 66, 76],
    [17, 27, 37, 47, 57, 67, 77],
    ]
print neighbors (arr, 2, 1, 1)
print neighbors (arr, 3, 5, 5)

相似回答