Skip to main content
 首页 » 编程设计

python之比较python中的多维数组

2025年05月04日14bjzhanghao

我有一个名为 old_arr 的多维数组,如下所示 [[8,8,8,8,0,0,0,0,6,6,5,5] ,[...]] 然后我有一个更新的多维数组 new_arr 像这样 [[9,9,6,7,3,6,5,0,6 ,4,3,4],[...]] 我想做的是更新 new_arr 以便如果其中的值对应于 0 在 old_arr 那么值应该是 0 否则保持新值。所以在上面的例子中 new_arr 看起来像这样 [[9,9,6,7,0,0,0,0,6,4,3,4],[. ..]] 其中 3、6、5 替换为 0。有什么建议吗?

我还想知道是否只有当周围 8 个相邻单元格中有 4 个的值也为 0 时才可以将单元格更新为 0? new_arr 和 old_arr 是多维数组(列表),表示行和列,因此它们就像一个大表格,如下图所示,如果 old_arr 中的相应单元格为 0,new_arr 中的蓝色单元格只会更新为零并且它的4个相邻单元格为0(照片中的白色单元格)

所以我需要检查所有 8 个相邻单元格(有时 6 个或 7 个,具体取决于它位于中间 (8) 或边缘 (7) 或角落 (6) 的单元格位置)是否为零并计算它们,如果计数为 4 或更多,则将单元格值设置为 0。

所以如果 old_arr 是

[[8,8,8,8,0,0,0,0,6,6,5,5], 
 [8,8,8,8,0,x,0,0,6,6,5,5], 
 [8,8,8,8,0,0,0,0,6,6,5,5], 
 [8,8,8,8,0,0,0,0,6,6,5,5],....] 
 
Where x is a zero 

而 new_arr 是

[[9,9,6,7,3,6,5,0,6,4,3,4], 
 [9,9,6,7,3,6,5,0,6,4,3,4], 
 [9,9,6,7,3,6,5,0,6,4,3,4], 
 [9,9,6,7,3,6,5,0,6,4,3,4],....] 

对于突出显示的单元格,new_arr 中的相应单元格将为零,因为 old_arr 中突出显示的单元格为 0,并且其相邻单元格中超过 4 个也为零。

更新的new_arr是

[[9,9,6,7,3,0,0,0,6,4,3,4], 
 [9,9,6,7,0,0,0,0,6,4,3,4], 
 [9,9,6,7,0,0,0,0,6,4,3,4], 
 [9,9,6,7,0,0,0,0,6,4,3,4],....] 

请您参考如下方法:

假设 old_arr 和 new_arr 的长度相同,你可以这样做:

old_arr = [[8,8,8,8,0,0,0,0,6,6,5,5], [8,8,7,0,0,0,0,0,6,6,5,5]] 
new_arr = [[9,9,6,7,3,6,5,0,6,4,3,4], [9,0,6,7,4,6,5,0,6,4,3,4]] 
 
new_arr = [[x if old[i] else 0 for i, x in enumerate(new)] for old, new in zip(old_arr, new_arr)] 
 
print(new_arr) 

哪些输出:

[[9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4], [9, 0, 6, 0, 0, 0, 0, 0, 6, 4, 3, 4]] 

更新:

这是一个处理相邻单元格的蛮力解决方案:

old_arr = [[8,8,8,8,0,0,0,0,6,6,5,5], 
           [8,8,8,8,0,0,0,0,6,6,5,5], 
           [8,8,8,8,0,0,0,0,6,6,5,5], 
           [8,8,8,8,0,0,0,0,6,6,5,5]] 
 
new_arr = [[9,9,6,7,3,6,5,0,6,4,3,4], 
           [9,9,6,7,3,6,5,0,6,4,3,4], 
           [9,9,6,7,3,6,5,0,6,4,3,4], 
           [9,9,6,7,3,6,5,0,6,4,3,4]] 
 
def first_last(row, next_row, old, new): 
    for i in range(len(new[row])): 
        count = 0 
        if old[row][i] == 0: 
            if old[row][i-1] == 0: 
                count += 1 
            if old[row][i+1] == 0: 
                count += 1 
            if old[next_row][i] == 0: 
                count += 1 
            if old[next_row][i-1] == 0: 
                count += 1 
            if old[next_row][i+1] == 0: 
                count += 1   
 
        if count > 4: 
            new[row][i] = 0 
 
def middle(old, new): 
    for i, l in enumerate(new[1:-1]): 
        for j in range(len(l)): 
            count = 0 
            if old[i][j] == 0: 
                if old[i][j-1] == 0: 
                    count += 1 
                if old[i][j+1] == 0: 
                    count += 1 
                if old[i-1][j] == 0: 
                    count += 1 
                if old[i-1][j-1] == 0: 
                    count += 1 
                if old[i-1][j+1] == 0: 
                    count += 1 
                if old[i+1][j] == 0: 
                    count += 1 
                if old[i+1][j-1] == 0: 
                    count += 1 
                if old[i+1][j+1] == 0: 
                    count += 1 
 
            if count > 4: 
                l[j] = 0 
 
# first row 
first_last(0, 1, old_arr, new_arr) 
 
# middle rows 
middle(old_arr, new_arr) 
 
# last row 
first_last(-1, -2, old_arr, new_arr) 
 
print(new_arr) 

哪些输出:

[[9, 9, 6, 7, 3, 0, 0, 0, 6, 4, 3, 4],  
 [9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4],  
 [9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4],  
 [9, 9, 6, 7, 3, 0, 0, 0, 6, 4, 3, 4]] 

注意:这可以做得更好,但您可以根据自己的喜好对其进行优化。