Python查找2D数组中节点的周围邻居列表

时间:2015-06-13 12:52:57

标签: python arrays nearest-neighbor

我一直在研究一种代码(Py 2.7),它生成一个元素数组,每个节点都分配了一些随机数。现在,我希望列出周围的元素,并找到最大值的索引。数组大小是可变的(我认为col =数组列大小)。我已经为每个节点分配了数字(我在下面称它为'),这样我就可以找到数组元素的2D索引。这是我写的

rn = s/col; cn = s%col;
b = [rr[rn,cn+1],rr[rn-1,cn+1],rr[rn-1,cn],rr[rn-1,cn-1],rr[rn,cn-1],rr[rn+1,cn-1],rr[rn+1,cn],rr[rn+1,cn+1]]
ma = max(b)
a = [i for i,j in enumerate(b) if j == ma]

是否有任何简短的方法可以找到邻居而无需为每个数组元素编号? (就像我使用s一样)。

1 个答案:

答案 0 :(得分:3)

您可以使用numpy。首先,让我们创建一个随机的5x5矩阵M进行测试......

>>> M = np.random.random((5, 5))
>>> M
array([[ 0.79463434,  0.60469124,  0.85488643,  0.69161242,  0.25254776],
       [ 0.07024954,  0.84918038,  0.01713536,  0.42620873,  0.97347887],
       [ 0.3374191 ,  0.99535699,  0.79378892,  0.0504229 ,  0.05136649],
       [ 0.73609556,  0.94250215,  0.67322277,  0.49043047,  0.60657825],
       [ 0.71153444,  0.43242926,  0.29726895,  0.2173065 ,  0.38457722]])

现在我们从这个矩阵N中取一个切片,保留一些中心元素的邻居(x, y)

>>> x, y = 2, 2
>>> N = M[x-1:x+2, y-1:y+2]
>>> N
array([[ 0.84918038,  0.01713536,  0.42620873],
       [ 0.99535699,  0.79378892,  0.0504229 ],
       [ 0.94250215,  0.67322277,  0.49043047]])

我们现在可以得到一个新矩阵,显示原始矩阵M的哪些元素等于max

中的N
>>> M == N.max()
array([[False, False, False, False, False],
       [False, False, False, False, False],
       [False,  True, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False]], dtype=bool)

现在我们可以使用numpy.where来获取此矩阵中True元素的索引。 zip获取元组列表的那些。

>>> zip(*np.where(M == N.max()))
[(2, 1)]

请注意,这些是原始矩阵M中的位置,即它们可能包含不在N中的元组。或者,您只能获得N中的最大值,但之后您必须添加x-1y-1作为偏移量。

>>> zip(*np.where(N == N.max()))
[(1, 0)]