比较python中的多维数组

比较python中的多维数组,python,multidimensional-array,Python,Multidimensional Array,我有一个多维数组,叫做old_arr,它是这样的[[8,8,8,0,0,0,0,6,6,5,5],…]然后我有一个更新的多维数组new_arr像这样的[[9,9,6,7,3,6,5,0,6,3,4],…]我想做的是更新new\u arr,这样如果其中的值对应于old\u arr中的0,那么该值应该是0,否则保留新值。因此,在上述示例中,new_arr看起来像这样的[[9,9,6,7,0,0,0,0,6,4,3,4],…],其中3,6,5替换为0。有什么建议吗 我还想知道,如果周围8个相邻单元中有

我有一个多维数组,叫做
old_arr
,它是这样的
[[8,8,8,0,0,0,0,6,6,5,5],…]
然后我有一个更新的多维数组
new_arr
像这样的
[[9,9,6,7,3,6,5,0,6,3,4],…]
我想做的是更新
new\u arr
,这样如果其中的值对应于
old\u arr
中的
0
,那么该值应该是
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一样,new_arr和old_arr都是多维数组(列表),表示行和列,因此它们就像下图所示的一个大表,如果old_arr中的对应单元格为0,并且其相邻单元格中的4个为0(照片中的白色单元格),则new_arr中的蓝色单元格将仅更新为零

因此,我需要检查所有相邻的8个单元(有时是6个或7个),取决于它们在中间(8)或边缘(7)或角(6)中的单元位置,如果它们为零或不计数,则如果计数为4或更多,则将单元格值设置为0。 所以如果老阿瑞是

[[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
而新奥尔是

[[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],....]
[[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],....]
对于高亮显示的单元,新的_arr中的对应单元将为零,因为旧的_arr中高亮显示的单元为0,并且其4个以上的相邻单元也为零

更新后的新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],....]
[[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)
first=[[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]]
second = [[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]]

for first_1,second_1 in zip(first,second):
    for index,value in enumerate(first_1):
        if value==0:
            try:
                if first_1[index-1]==0 and first_1[index+1]==0:
                    second_1[index]=0
                    second_1[index-1]=0
                    second_1[index+1]=0
            except IndexError:
                pass
print(second)
哪些产出:

[[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]]

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

假设
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)
first=[[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]]
second = [[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]]

for first_1,second_1 in zip(first,second):
    for index,value in enumerate(first_1):
        if value==0:
            try:
                if first_1[index-1]==0 and first_1[index+1]==0:
                    second_1[index]=0
                    second_1[index-1]=0
                    second_1[index+1]=0
            except IndexError:
                pass
print(second)
哪些产出:

[[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]]

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

具有列表理解功能的简单解决方案:

>>> old_arr=[9,9,6,7,3,6,5,0,6,4,3,4]
>>> new_arr=[8,8,8,8,0,0,0,0,6,6,5,5]
>>> [new_arr[i] if old_arr[i] else 0 for i in range(len(new_arr))]
[9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4]

具有列表理解功能的简单解决方案:

>>> old_arr=[9,9,6,7,3,6,5,0,6,4,3,4]
>>> new_arr=[8,8,8,8,0,0,0,0,6,6,5,5]
>>> [new_arr[i] if old_arr[i] else 0 for i in range(len(new_arr))]
[9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4]

列表在Python中是可修改的序列,因此您可以就地更改它们,这对于大型数据集是有意义的。只需使用两个嵌套循环即可完成此操作:

for i, l in enumerate(new_arr):
    for j in range(len(l)):
        if old_arr[i][j] == 0:
            l[j] = 0

列表在Python中是可修改的序列,因此您可以就地更改它们,这对于大型数据集是有意义的。只需使用两个嵌套循环即可完成此操作:

for i, l in enumerate(new_arr):
    for j in range(len(l)):
        if old_arr[i][j] == 0:
            l[j] = 0
例如:
old_arr=[[8,8,8,0,0,0,6,6,5,5],[1,2,3,4,5,6,7,8]]
新的arr=[[9,9,6,7,3,6,5,0,6,4,3,4],[8,3,4,5,6,78,8,9]]
自定义比较(旧的、新的)
最后新的arr=[[9,9,6,7,0,0,0,0,6,4,3,4],[8,3,4,5,6,78,8,9]

例如:
old_arr=[[8,8,8,0,0,0,6,6,5,5],[1,2,3,4,5,6,7,8]]
新的arr=[[9,9,6,7,3,6,5,0,6,4,3,4],[8,3,4,5,6,78,8,9]]
自定义比较(旧的、新的)

最后,new_arr=[[9,9,6,7,0,0,0,0,6,4,3,4],[8,3,4,5,6,78,8,9]
一个简单的方法是这样的:

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)
first=[[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]]
second = [[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]]

for first_1,second_1 in zip(first,second):
    for index,value in enumerate(first_1):
        if value==0:
            try:
                if first_1[index-1]==0 and first_1[index+1]==0:
                    second_1[index]=0
                    second_1[index-1]=0
                    second_1[index+1]=0
            except IndexError:
                pass
print(second)
输出:

[[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]
 [9 9 6 7 0 0 0 0 6 4 3 4]]

一个简单的方法如下:

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)
first=[[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]]
second = [[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]]

for first_1,second_1 in zip(first,second):
    for index,value in enumerate(first_1):
        if value==0:
            try:
                if first_1[index-1]==0 and first_1[index+1]==0:
                    second_1[index]=0
                    second_1[index-1]=0
                    second_1[index+1]=0
            except IndexError:
                pass
print(second)
输出:

[[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]
 [9 9 6 7 0 0 0 0 6 4 3 4]]


它们在python中没有数组列表吗?数组列表仅在java中使用。您所说的“数组列表”是指“列表”吗?还是“名单”?因为你不是指“数组列表”。@khelwood我指的是多维数组,如示例所示,你是指numpy数组吗?或列表列表?对于突出显示的单元格
[8,8,8,8,0,**0**,0,0,6,6,5,5]
,只有相邻单元格的
3
0
?除非我看得不对。它们在python中没有数组列表?数组列表仅在java中使用。您所说的“数组列表”是指“列表”吗?还是“名单”?因为你不是指“数组列表”。@khelwood我指的是多维数组,如示例所示,你是指numpy数组吗?或列表列表?对于突出显示的单元格
[8,8,8,8,0,**0**,0,0,6,6,5,5]
,只有相邻单元格的
3
0
?除非我看得不对。给定一个类型Error range()预期的整数结束参数,得到list@SergeBallesta但是如何将更新保存回new_arr?@Tak:更新直接在
new_arr
中完成。您的问题是什么?提供了一个类型错误范围()整数结束参数list@SergeBallesta但是如何将更新保存回new_arr?@Tak:更新直接在
new_arr
中完成。你的问题是什么?只有当它周围的4个相邻单元的值也为0时,才可能将其更新为0吗?它们是表示行和列的多维数组(列表),所以它们就像一个大表。因此,在这张图中,只有当旧_arr中的对应单元格为0,并且它的4个相邻单元格为0(照片中的白色单元格)时,新_arr中的蓝色单元格才会更新为零。Tak完全可能,我会更新我的答案。你能详细描述一下“四个相邻的细胞”吗?零的两边是2吗?还是零的两边各有4个?我不明白这一点。我检查所有8个相邻单元(有时6个或7个,取决于单元位置)是否为零,并对它们进行计数,如果计数为4个或更多,则将单元值设置为0@Tak对不起,我有点忙,忘了回复。您是否可以发布此行为的示例输入和预期输出?这将使它更容易。问题更新,请让我知道,如果我需要澄清任何更多。谢谢,只有当它周围的4个相邻单元格的值也为0时,才可能将其更新为0吗?它们是表示行和列的多维数组(列表),所以它们就像一个大表。所以