Python 查找二维数组中节点的周围邻居列表
Python find list of surrounding neighbours of a node in 2D array
我一直在研究一个代码 (Py 2.7),它生成一个元素数组,每个节点都分配了一些随机数。现在,我想列出周围的元素,并找到最大值的索引。数组大小是可变的(我认为 col = 数组列大小)。我为每个节点分配了编号(我在下面将其称为 's'),以便我可以找到数组元素的二维索引。这是我写的
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 一样)。
您可以为此使用 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
的哪些元素等于 N
中的 max
>>> 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-1
和 y-1
作为偏移量。
>>> zip(*np.where(N == N.max()))
[(1, 0)]
我一直在研究一个代码 (Py 2.7),它生成一个元素数组,每个节点都分配了一些随机数。现在,我想列出周围的元素,并找到最大值的索引。数组大小是可变的(我认为 col = 数组列大小)。我为每个节点分配了编号(我在下面将其称为 's'),以便我可以找到数组元素的二维索引。这是我写的
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 一样)。
您可以为此使用 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
的哪些元素等于 N
max
>>> 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-1
和 y-1
作为偏移量。
>>> zip(*np.where(N == N.max()))
[(1, 0)]