【发布时间】:2015-12-01 09:02:26
【问题描述】:
我需要在二维数组中找到任何节点的基数和对角邻居。取下面的数组。我正在从数组上的 [1, 1] 1 中搜索。它应该返回周围的 0。我可以找到刚刚找到的邻居,如下面的一些代码所示,但它们太慢了。
[[0, 0, 0]
[0, 1, 0]
[0, 0, 0]]
我可以像这样强制它返回所有 8 个周围节点的坐标。
def ReturnNeighbors(x, y):
numpy.array([(x-1, y), (x, y-1), (x+1, y), (x, y+1),
(x-1, y-1), (x+1, y+1), (x-1, y+1), (x+1, y-1)])
def ReturnNeighbors_4(x, y):
for i in xrange(x - 1, x + 2):
for j in xrange(y - 1, y + 2):
if (i, j) != (x, y):
yield (i, j)
或者通过计算到所有节点的距离并返回距离
我在切换到 numpy 之前处理这个问题的方式是我的数组中充满了实际的节点对象作为值。每个对象都将其 x 和 y 坐标存储在网格和一组相邻对象中。像这样。我不能再使用这种方法了,因为填充一个充满节点的巨大数组需要很长时间。即使在一个包含 10000 个节点对象的 100x100 小地图中!我计划以后不仅有更大的地图,而且在任何给定时间都有多个地图处于活动状态。由于节点印记,我实际上已经用完了内存试图创建更大的地图。它适用于小地牢,但不适用于模拟多张地图的世界。
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
出于各种原因,我需要一个节点邻居。使用元胞自动机平滑地图、在战斗中在附近溅血、使用广度优先搜索进行寻路等等。这是我正在创建的roguelike。蛮力方法适用于小型 60x60 地牢,但现在我正在扩大范围并生成世界地图。它只有 200x200,而且速度非常慢。
【问题讨论】:
-
数组中总是只有 0 还是 1?您需要这 8 个邻居的索引还是只需要元素本身?
-
这个数组充满了大量不同的整数。 0 是土地,1 是水,2 是树木等等。我需要 8 个邻居的坐标。
-
我们如何处理边界条件,即在没有 8 个邻居的边界处为 1。当两个 1 共享邻居时,我们是否还应该为每个旋转的 1 报告重叠的邻居两次?
-
如果他们不是 8 个邻居,那么它应该只返回有多少邻居可用。就像在数组的最边缘它应该返回 5 个邻居或在角落它应该返回 3,因为其他邻居不存在超出边界。第二个问题有点超出我的理解。我不确定你所说的重叠和旋转是什么意思。
-
我假设您在输入数组中 1 的所有位置的所有 X 和 Y 上运行
ReturnNeighborsfunc。因此,按照这个假设,现在假设您在输入数组中有一堆1s,并且您希望其中每个 1 有八个邻居。然后,如果你有几个 1 足够接近,他们的邻居可能是相同的,所以我们仍然应该报告他们吗?此外,如果假设成立,我建议发布一个通用示例案例,其边界为 1,并且足够接近一堆 1,并以您希望的格式发布预期输出。
标签: python arrays numpy 2d nearest-neighbor