我有一个名为 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]]
注意:这可以做得更好,但您可以根据自己的喜好对其进行优化。
关于python - 比较python中的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202943/