假设我有一个如下所示的 4x4 矩阵:
[[0, 0, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]]
我想编写一个函数,获取一个的所有 4 个周围字段并将它们也变成 1。
上面的矩阵会变成:
[[0, 0, 1, 0]
[0, 1, 1, 1]
[0, 0, 1, 0]
[0, 0, 0, 0]]
我知道这可以使用 if 语句,但我真的想优化我的代码。
矩阵只包含 0 和 1。如果 1 位于矩阵的边缘,则 1 不应回绕,即如果最左边的字段为 1,则最右边的字段仍为 0。另外,我使用的是 Python 3.5
是否有更数学或更简洁的方法来做到这一点?
最佳答案
这看起来像二进制膨胀。 SciPy 中有一个函数可以有效地实现这一点:
>>> from scipy.ndimage import binary_dilation
>>> x
array([[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
>>> binary_dilation(x).astype(int)
array([[0, 0, 1, 0],
[0, 1, 1, 1],
[0, 0, 1, 0],
[0, 0, 0, 0]])
边缘的 1 按照您指定的方式处理(即不换行)。
参见 documentation进一步的选择和论据。
关于python - NumPy:填充数组中 1 周围的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40223114/