【问题标题】:Python find list of surrounding neighbours of a node in 2D arrayPython在二维数组中查找节点周围邻居的列表
【发布时间】:2015-06-13 22:23:51
【问题描述】:

我一直在编写一个代码(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 所做的那样)。

【问题讨论】:

  • 您的问题令人困惑。试着用很简单的话来表达。有预期的结果或你想要达到的目标。
  • @boardrider 是的,我参考了那个链接
  • @csharpcoder 我的代码旨在创建一个具有不同行和列大小的二维数组,并分配随机数(最好取自均匀分布)。该代码应允许用户输入所选数组的开始和结束节点。因此,我制作了一个假定行和列大小(避免数组索引)的编号矩阵,我称之为 s(状态)。程序需要从起始状态开始并移动到结束,这样在每个状态下,它都会移动到具有最大数量的下一个状态(在邻居之间)。
  • @csharpcoder - 创建的数字矩阵对用户可见,用户可以从矩阵形式中选择两个数字作为开始和结束状态。

标签: python arrays nearest-neighbor


【解决方案1】:

您可以为此使用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 的哪些元素等于来自 Nmax

>>> 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)]

【讨论】:

  • 附录:如果您在其余代码中未使用 numpy:您可以轻松转换为 numpy 并使用 np.array(list_of_lists)list(map(list, numpy_matrix)) 转换回来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多