我正在尝试用矩阵来解决一个任务。我有函数:fill_area(矩阵,坐标,值)。例如,如果我要输入坐标(1,0)和值3,它应该在位置1写入3,并将值重写为3。如果近邻的数字具有相同的值,它也应该重写它们。我想使用堆栈或队列来存储数字,它们必须更改一个值。但是我不知道,怎么检查所有最近的位置。
matrix = [[2, 0, 1],
[0, 0, 1],
[0, 1, 1]]
fill_area(matrix, (1, 0), 3)
matrix = [[2, 0, 1],
[3, 3, 1],
[3, 1, 1]]发布于 2020-12-06 21:18:02
处理矩阵的首选方法是numpy,但似乎没有明显的方法来处理这种特殊情况,同时避免对numpy中的项进行循环。我从你的例子中可以看出,你将“贴近度”定义为给定坐标周围的面片,但仅在坐标方向上。我有两个版本,一个用于给定坐标周围的整个坐标片,另一个仅用于ij方向(根据您的示例)。两者都是列表理解,为了更好的可读性,您可能希望将其更改为常规循环。
def fill_area(mat, ij, val):
'''set patch around ij in mat to val for all positions where the original mat value == mat val at ij, full patch'''
return [[val if abs(i-ij[0])<2 and abs(j-ij[1])<2 and mat[i][j] == mat[ij[0]][ij[1]]
else mat[i][j] for j in range(len(mat[1]))] for i in range(len(mat))]
def fill_area1(mat, ij, val):
'''set patch around ij in mat to val for all positions where the original mat value == mat val at ij, patch ij-dir'''
return [[val if ((abs(i-ij[0])<2 and j==ij[1]) or (abs(j-ij[1])<2 and i==ij[0])) and mat[i][j] == mat[ij[0]][ij[1]]
else mat[i][j] for j in range(len(mat[1]))] for i in range(len(mat))]
matrix = [[2, 0, 1],
[0, 0, 1],
[0, 1, 1]]
print('entire patch: ', fill_area(matrix, (1, 0), 3))
print('ij-directional: ', fill_area1(matrix, (1, 0), 3))它会产生
entire patch: [[2, 3, 1], [3, 3, 1], [3, 1, 1]]
ij-directional: [[2, 0, 1], [3, 3, 1], [3, 1, 1]]https://stackoverflow.com/questions/65167697
复制相似问题