使用for循环和if语句在未知索引情况下更改二维数组中的特定值。

huangapple go评论102阅读模式
英文:

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

问题

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

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

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

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

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

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

  1. for l in example_array:
  2. for i, x in enumerate(l):
  3. if x > 1:
  4. if x > 1:
  5. l[i] -= 100
  6. break

这里的思路是,如果我在for循环中添加另一个if x > 1:条件,它将从第一个大于1的数字开始,然后移动到下一个if x > 1:中大于1的第二个值。但在这里不是这种情况。有人有关于如何正确更改第二个大于1的数字的建议,以便显示下面的正确example_array吗?

  1. example_array = [[0, 1, 101, 0, 0, 0, 0],
  2. [2, 101, 1, 2, 0, 0, 0],
  3. [0, 3, 101, 1, 3, 0, 0],
  4. [4, 101, 1, 4, 0, 0, 0],
  5. [0, 5, 101, 1, 5, 0, 0],
  6. [0, 1, 101, 0, 0, 0, 0]]
英文:

I have a 2D array from a geotiff file. See the example array below:

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

I am attempting to write a program that will change the specific number greater than 1 in each nested list to the 'value + 100'.

With the help of others see the below working code snippet that correctly changes the first value in each list greater than 1 to +100 of the value.

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

If I wanted to change exclusively the second value in each list greater than 1 I attempted the below incorrect code snippet:

  1. for l in example_array:
  2. for i, x in enumerate(l):
  3. if x > 1:
  4. if x > 1:
  5. l[i] -= 100
  6. break

The thought process here is that if I added another if x>1: argument to the for loop it would start at the first number greater than 1 then move to the second value greater than 1 with the next if x>1:. That is not the case here. Does anyone have any suggestions on how to correctly change the second number greater that 1 such that is displays the correct example_array below?:

  1. example_array = [[ 0, 1, 101, 0, 0, 0, 0],
  2. [ 2, 101, 1, 2, 0, 0, 0],
  3. [ 0, 3, 101, 1, 3, 0, 0],
  4. [ 4, 101, 1, 4, 0, 0, 0],
  5. [ 0, 5, 101, 1, 5, 0, 0],
  6. [ 0, 1, 101, 0, 0, 0, 0]]

答案1

得分: 0

我假设在你的问题中,">=1" 的意思是大于等于1,而不是大于1,根据你提供的最后一个例子。这不是最优雅的解决方案,但我想这可能是你想要的:

  1. for l in example_array:
  2. c = 0
  3. for i, x in enumerate(l):
  4. if x >= 1:
  5. if c == 1:
  6. l[i] += 100
  7. break
  8. c += 1

然而,你可以使用NumPy更高效地实现:

  1. import numpy as np
  2. # 假设example_array是一个列表的列表
  3. for row in example_array:
  4. row_np = np.array(row) # 将列表转换为NumPy数组以进行比较
  5. positive_indices = np.where(row_np >= 1)[0] # 获取大于等于1的元素的索引
  6. if len(positive_indices) >= 2: # 检查是否至少有两个大于等于1的元素
  7. row[positive_indices[1]] += 100 # 在第二个大于等于1的元素上加100
英文:

I assumed for this response that you meant >=1 and not >1, judging by the final example you provided.

this is not the pretties solution but i guess it is what you're looking for:

  1. for l in example_array:
  2. c = 0
  3. for i, x in enumerate(l):
  4. if x >= 1:
  5. if c == 1:
  6. l[i] += 100
  7. break
  8. c += 1

However you can do it much more efficiently using numpy:

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

huangapple
  • 本文由 发表于 2023年5月21日 05:57:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76297507.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定