python - 比较python中的多维数组

标签 python multidimensional-array

我有一个名为 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 以便如果其中的值对应于 0old_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(照片中的白色单元格)

enter image description here

所以我需要检查所有 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_arrnew_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]]

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

关于python - 比较python中的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202943/

相关文章:

python - 没有名为 'torch.utils.data.distributed' 的模块

python - 框架的tkinter滚动条

python - 如何用掩码和索引替换双 for 循环?

java - 循环遍历二维数组中的主对角线 (/) 及其下方的单元格

C:二维数组与普通数组相同大小的区别

python - 扩展 mnist 数据库

python - 谷歌合作实验室: No module named pytextrank can be found (worked previously with the same notebook)

python - 多重继承自 QObject 和 QRunnable 错误

c++ - 在 C++ 中将 memset 与多维数组一起使用

C++ 删除 vector 的某些元素