提问人:Patstro 提问时间:5/21/2023 更新时间:5/21/2023 访问量:81
使用没有已知索引的 For 循环和 If 语句更改 2D 数组中的特定值
Changing Specific Values In a 2D array Using For Loops and If statements without a known Index
问:
我有一个来自 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 loop
if 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]]
答:
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”
评论
l[i] += 100
1
[1, 0, 0, 1, 2, 1, 1]
enumerate