如何检查数组中的元素是否被另一个特定元素包围

How to check if an element in an array is surrounded by another specific element

这个问题是通过考试向我提出的,练习是创建一个随机生成的包含 0 和 1 的 10x10 数组。 然后你必须相应地给它们上色。 如果任何 1 的四周都被 0 包围,则不要给它们着色。 我已经完成了一半的练习,似乎无法找到完成最后一项任务的方法。

import numpy as np
from colorama import Fore
random_matrix = np.random.randint(0, 2,(10, 10))
print(random_matrix)
for row in random_matrix:
    for i in row:
        if i == 0:
            i = (Fore.RED + str(i))
        if i == 1:
            i = (Fore.BLUE + str(i))
        print(i, end=' ')
    print()

由于您的解释不够准确,我不会完全按照您的要求去做。例如。你所说的被包围是什么意思,你只是在说你不想要的,但你想给剩下的涂上颜色吗?因此,我只是展示如何做类似的事情。

我随机选取一个 10 x 10 的 0 和 1 数组,然后为被 0 包围的所有内容着色。包围我的意思是所有 4 边为零或 2/3 边,如果它是 corner/border 点。

我的想法是,我在这 4 个方向上移动数组,并将结果的负数与逻辑与结合起来。问题是,如果我采用 numpy 的做法,它会认为边界处的事物与另一个站点的边界相邻。所以我必须将它们设置为零。

我在这里生成 10 x 10 数组。

import numpy as np
import pandas as pd
import itertools
import functools

np.random.seed(0)
arr = np.random.randint(0,2,size=(10,10))

我按照上面的方法定义特殊的roll,然后组合起来得到包围的点。

def my_roll(arr, shift=None, axis=None):
    arr = np.roll(arr, shift=shift, axis=axis)
    pos = 0 if shift > 0 else -1
    idx = tuple(Ellipsis if i != axis else pos for i in range(len(arr.shape)))
    arr[idx] = 0
    return arr

surrounded = functools.reduce(np.logical_and, [np.roll(arr,shift=shift, axis=ax)==0 
                                                for ax,shift in itertools.product((0,1),(-1,1))])

在这里我可以说它完成了,你可以停止阅读,但我还会包括我用来绘制结果的代码。

@np.vectorize
def surrounded_styler(x):
    return 'color:red;' if x else None

def style_negative(v, props=''):
    return props if v > 0 else None

pd.DataFrame(arr).style.apply(lambda df:surrounded_styler(surrounded), axis=None)