如何检查数组中的元素是否被另一个特定元素包围
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)
这个问题是通过考试向我提出的,练习是创建一个随机生成的包含 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)