在numpy阵列上创建边界

2024-09-29 01:20:35 发布

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

我正在寻找一种算法,可以帮助我在二维阵列上的非零点周围创建边界。让我举个例子

我有以下数组:]

enter image description here

我想要一个算法,它能让我以最有效的方式在每个小“岛屿”周围建立一个“路障”。在上下文中,每组1代表了这个资源管理游戏中的一个资源来源,我想在它周围筑墙,以防我的对手

基本上,该算法应给出下图中的2s值:

enter image description here

这方面有几点:

  • 阵列始终为正方形,但每个维度的大小可以从12到40不等
  • 单位不能在对角线上移动
  • 可以有各种岛屿(一组1s),可以有各种不规则形状
  • 有时,如果两个离得很近的“岛屿”离得很近,用同一个路障封锁它们可能会更有效

有什么想法吗?我甚至不知道如何用谷歌搜索这个问题,所以我最终什么也没找到。谢谢大家!

EDIT1:创建初始数组的代码 编辑2:修正了答案

import numpy as np

size = 15
test_mat = np.zeros((size, size))
test_mat[(4, 5, 5, 6), (5, 4, 6, 5)] = 1
test_mat[(9, 9, 9, 10, 10, 11, 11), (8, 9, 10, 8, 10, 8, 10)] = 1

Tags: test算法游戏sizenp方式代表数组
2条回答

这并不能解决我的问题,只是想发布一个我正在玩的想法。代码如下:

import numpy

# Generate the map
size = 15
test_mat = np.zeros((size, size))
test_mat[(4, 5, 5, 6), (5, 4, 6, 5)] = 1
test_mat[(9, 9, 9, 10, 10, 11, 11), (8, 9, 10, 8, 10, 8, 10)] = 1

# Find a solution by applying a convulsion
conv_mat = np.array([
        [0, 1, 0], 
        [1, 1, 1],
        [0, 1, 0]])

conv = convolve(test_mat, conv_mat)
conv[test_mat > 0] = 0
conv[conv > 0] = 2
conv[test_mat > 0] = 1 # Mark the resources as 1

使用此代码可以获得:

enter image description here

但是,正如您所看到的,当存在差距时,这并没有找到正确的解决方案

这个怎么样:

import numpy as np
from scipy.ndimage import binary_dilation, binary_erosion

size = 15
test_mat = np.zeros((size, size))
test_mat[(4, 5, 5, 6), (5, 4, 6, 5)] = 1
test_mat[(9, 9, 9, 10, 10, 11, 11), (8, 9, 10, 8, 10, 8, 10)] = 1

dilated = binary_dilation(test_mat).astype(int)
eroded = binary_erosion(dilated)
borders = dilated-eroded

其中:

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

相关问题 更多 >