在二维网格上找到8个邻居

2024-05-29 05:07:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找到二维数组中任何节点的基数和对角邻域。取下阵法。我从数组上的[1,1]开始搜索。它应该返回周围的0。我可以像下面的一些代码中显示的那样找到邻居,但是它们太慢了。在

[[0, 0, 0]
 [0, 1, 0]
 [0, 0, 0]]

我可以像这样强制它返回所有8个周围节点的坐标。在

^{pr2}$

或者通过计算到所有节点的距离并返回带有距离的节点<;2,但是我发现的这些和其他解决方案都很慢。我学纽姆舞的全部原因是速度。我想我需要使用scipy卷积2d或cKDtree,但它们对我来说太复杂了。在

在切换到numpy之前,我处理这个问题的方法是数组中充满了实际的节点对象作为值。每个对象都将其x和y坐标存储在网格中以及一组相邻对象中。这样地。我不能再使用这种方法了,因为填充一个充满节点的巨大数组需要很长时间。即使在一个100x100的小地图上也有10000个节点对象!我计划以后不仅有更大的地图,而且有多个地图在任何时候都是活动的。实际上,由于节点印记,我尝试创建更大的贴图时内存不足。它适用于小型地下城,但不适用于模拟多张地图的世界。在

ExampleNode(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.neighbors = set()

        # The neighbors are found and added to the above set later.

node = Example(0, 0)

for neighbor in node.neighbors:
    do thing with each neighbor

我需要一个节点邻居出于各种原因。使用元胞自动机平滑地图,在战斗中溅血,用广度优先搜索寻路等等。这是给我创造的流氓。蛮力方法适用于小型60x60地下城,但现在我正在扩展范围并生成世界地图。它只有200x200而且速度慢得令人恼火。在


Tags: 对象方法selfnode距离节点地图neighbors
1条回答
网友
1楼 · 发布于 2024-05-29 05:07:07

假设输入数组名为A,它包含所有整数,我们只处理其中1s的元素,并尝试获取它们的邻居。这里有一种方法-

# Get offsets for row and column
R_offset,C_offset = np.meshgrid(np.arange(-1,2),np.arange(-1,2))

# Get row and column indices for places where elements are 1s
R_match,C_match = np.nonzero(A==1)

# Store number of matches as it would be frequently used
N = R_match.size

# Get offsetted row, col indices for all matches
R_idx = (R_match[:,None,None] + R_offset).reshape(N,-1)
C_idx = (C_match[:,None,None] + C_offset).reshape(N,-1)

# Based on boundary conditions set invalid ones to zeros
valid_mask = (R_idx>=0) & (C_idx>=0) & (R_idx<A.shape[0]) & (C_idx<A.shape[1])
valid_mask[:,4] = 0 # Set the pivot(self/center) ones to invalid

# Using valid mask, "cut off" elements from each group of 9 elems
cut_idx = valid_mask.sum(1).cumsum()

# Finally form groups
grps_R = np.split(R_idx[valid_mask],cut_idx)[:-1]
grps_C = np.split(C_idx[valid_mask],cut_idx)[:-1]

关于如何解释和使用输出的示例运行和说明-

^{pr2}$

因此,我们根据A中的三个1s分为三组。在

第一个在左上角-

In [259]: np.column_stack((R_match[0],C_match[0]))  # First point
Out[259]: array([[0, 0]])

In [260]: np.column_stack((grps_R[0],grps_C[0]))    # Its three neighbors
Out[260]: 
array([[1, 0],
       [0, 1],
       [1, 1]])

第二个在(2,2)-

In [263]: np.column_stack((R_match[1],C_match[1]))  # Second point 
Out[263]: array([[2, 2]])

In [264]: np.column_stack((grps_R[1],grps_C[1]))    # Its eight neighbors
Out[264]: 
array([[1, 1],
       [2, 1],
       [3, 1],
       [1, 2],
       [3, 2],
       [1, 3],
       [2, 3],
       [3, 3]])

最后第三个是(4,5)-

In [265]: np.column_stack((R_match[2],C_match[2]))  # Third point 
Out[265]: array([[3, 4]])

In [266]: np.column_stack((grps_R[2],grps_C[2]))    # Its three neighbors
Out[266]: 
array([[2, 3],
       [3, 3],
       [2, 4]])

相关问题 更多 >

    热门问题