使用没有已知索引的 For 循环和 If 语句更改 2D 数组中的特定值

Changing Specific Values In a 2D array Using For Loops and If statements without a known Index

提问人:Patstro 提问时间:5/21/2023 更新时间:5/21/2023 访问量:81

问:

我有一个来自 geotiff 文件的 2D 数组。请参阅下面的示例数组:

example_array = [[ 0, 1, 1, 0, 0, 0, 0], 
                 [ 2, 1, 1, 2, 0, 0, 0], 
                 [ 0, 3, 1, 1, 3, 0, 0], 
                 [ 4, 1, 1, 4, 0, 0, 0], 
                 [ 0, 5, 1, 1, 5, 0, 0], 
                 [ 0, 1, 1, 0, 0, 0, 0]]

我正在尝试编写一个程序,该程序会将每个嵌套列表中大于 1 的特定数字更改为“值 + 100”。

在其他人的帮助下,请参阅下面的工作代码片段,该代码片段正确地将每个列表中的第一个值更改为大于 1 到 +100 的值。

for l in example_array:
    for i, x in enumerate(l):
        if x > 1:
            l[i] -= 100
            break

如果我想专门更改每个列表中大于 1 的第二个值,我尝试了以下不正确的代码片段:

for l in example_array:
    for i, x in enumerate(l):
        if x > 1:
            if x > 1:
                l[i] -= 100
                break 

这里的思维过程是,如果我向 添加另一个参数,它将从第一个大于 1 的数字开始,然后移动到第二个大于 1 的值。这里的情况并非如此。有没有人对如何正确更改大于 1 的第二个数字有任何建议,以便在下面显示正确的数字?if x>1:for loopif x>1:example_array

    example_array = [[ 0,  1, 101, 0, 0, 0, 0], 
                     [ 2, 101, 1,  2, 0, 0, 0], 
                     [ 0,  3, 101, 1, 3, 0, 0], 
                     [ 4, 101, 1,  4, 0, 0, 0], 
                     [ 0,  5, 101, 1, 5, 0, 0], 
                     [ 0,  1, 101, 0, 0, 0, 0]]
Python 数组 for-loop if-statement nested-lists

评论

0赞 CristiFati 5/21/2023
怎么了?提示:您添加的 if 绝对没有效果。l[i] += 100
0赞 MattDMo 5/21/2023
大于 1 或 >= 1?在第一个列表中,没有大于 1 的元素,但您已在第一个值之后递增了该元素。你的逻辑没有意义。例如,你会如何处理?1[1, 0, 0, 1, 2, 1, 1]
0赞 MattDMo 5/21/2023
另外,为什么要使用而不是直接迭代列表元素?enumerate

答:

0赞 Lino 5/21/2023 #1

根据您提供的最后一个示例,我假设您的意思是 >=1 而不是 >1。

这不是漂亮的解决方案,但我想这就是你要找的:

for l in example_array:
    c = 0
    for i, x in enumerate(l):
        if x >= 1:
            if c == 1:
                l[i] += 100
                break
            c += 1

但是,您可以使用 numpy 更有效地做到这一点:

import numpy as np

# Assuming example_array is a list of lists
for row in example_array:
    row_np = np.array(row)  # Convert list to NumPy array for the comparison
    positive_indices = np.where(row_np >= 1)[0]  # Get indices of elements greater than or equal to 1
    if len(positive_indices) >= 2:  # Check if there are at least two elements greater than or equal to 1
        row[positive_indices[1]] += 100  # Add 100 to the second element greater than or equal to 1

评论

0赞 Patstro 5/23/2023
有没有办法使用 numpy 方法从元素列表的末尾开始,并使其除了第二个数字 >= 1 之外,还更改倒数第二个数字 >= 1?
0赞 Lino 5/24/2023
OFC,np.where 函数返回满足条件的所有索引。因此,如果您想将第 2 行更改为倒数,您可以添加另一行,该行进入索引 -2。像这样:“row[positive_indices[-2]] += 100”