【问题标题】:Iterating on Python 2d array indexes and values [closed]迭代 Python 2d 数组索引和值 [关闭]
【发布时间】:2020-02-11 20:51:43
【问题描述】:

我有一个如下所示的二维数组,我想知道非负数的索引,例如 0 的索引为 1,1 的索引为 6,8 的索引为25. 我该怎么做?

x=[[0, -1, -1, -1, -1], 
[1, 2, -1, -1, -1], 
[-1, 3, 4, 5, -1], 
[-1, -1, -1, 6, -1], 
[-1, -1, -1, 7, 8]]

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我现在一无所知。我正在寻找可以索引二维数组的东西。
  • 我们通常使用 2 个数字来索引 2D 列表。我不确定“8 的索引将是 25”是什么意思。也许您只想将 2D 列表展平为 1D 列表?
  • 看看this question。它没有涵盖您的确切问题,但它是一个很好的起点。

标签: python arrays


【解决方案1】:

简短说明: 您需要像这样在二维数组上迭代两次。第一次迭代在数字数组上,第二次迭代(嵌套一次)在每个数组的数字上。此外,您需要更新包含当前元素索引的计数器。或者,就像在您的情况(以及在我的代码示例中)一样,所有数组的长度都相同,因此您不必更新和计数,您可以通过他的索引和他的数组索引来计算每个元素。

此代码将为您完成工作:

def non_neg_indices(num_list):
    for arr_index, arr in enumerate(num_list): 
        for ele_index, ele in enumerate(arr):
            if (ele >= 0):
                print (arr_index*len(arr) + ele_index,ele) 

enumerate 帮助您使用索引。

您的意见:

x=[[0, -1, -1, -1, -1], 
[1, 2, -1, -1, -1], 
[-1, 3, 4, 5, -1], 
[-1, -1, -1, 6, -1], 
[-1, -1, -1, 7, 8]]     

执行:

non_neg_indices(x)

输出将是:

0 0
5 1
6 2
11 3
12 4
13 5
18 6
23 7
24 8

【讨论】:

    【解决方案2】:

    这是pythonic的方法。

    x=[[0, -1, -1, -1, -1], 
    [1, 2, -1, -1, -1], 
    [-1, 3, 4, 5, -1], 
    [-1, -1, -1, 6, -1], 
    [-1, -1, -1, 7, 8]]
    indexes = [(i+1)*(j+1) for i, row in enumerate(x) for j,value in enumerate(row) if value >= 0]
    print(indexes)
    

    【讨论】:

      【解决方案3】:

      您可以尝试以下方法,其中 n 是您要查找的元素。 我从您的示例中假设这些是不同的元素。

      def indexOf(n, array_2d):
          idx = 0
          for arr in array_2d:
              for element in arr:
                  idx += 1 
                  if element == n:
                      return idx
      
      print(indexOf(0,x)) # output = 1
      print(indexOf(1,x)) # output = 6
      print(indexOf(8,x)) # output = 25
      

      【讨论】:

      • 为什么不使用enumerate(),为什么使用camelCase函数名?
      【解决方案4】:

      您可以将list 展平,然后使用enumerate 得到这样的索引:

      x=[[0, -1, -1, -1, -1], 
      [1, 2, -1, -1, -1], 
      [-1, 3, 4, 5, -1], 
      [-1, -1, -1, 6, -1], 
      [-1, -1, -1, 7, 8]]
      
      c = []
      for row in x:
          c.extend(row)
      
      indexes = [(i+1, value) for i, value in enumerate(c) if value >= 0]
      print(indexes)
      
      >>> [(1, 0), (6, 1), (7, 2), (12, 3), (13, 4), (14, 5), (19, 6), (24, 7), (25, 8)]
      
      

      【讨论】:

        【解决方案5】:

        根据我对问题的理解,您正在寻找满足您条件的值的位置 (x>=0)。不是作为嵌套列表,而是作为平面列表(8 的索引将是 [4][4])。 在这种情况下,我会将列表展平如下:

        flags = [1 if item>=0 else 0 for sublist in x for item in sublist]
        result = [i+1 for i, flag in enumerate(flags) if flag==1]
        

        此结果不允许您获取满足条件的值。例如x[result[-1]] 会引发异常,因为 25 不是您的列表列表的索引。

        无论如何,对于这样的比较,在更大的范围内,我强烈建议使用这样的 pandas:

        import pandas as pd
        df = pd.DataFrame(x)
        df[df>=0].index
        

        这将返回正确的索引,供以后在 pandas 数据帧(或 numpy 数组)上使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-11
          • 1970-01-01
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          • 1970-01-01
          • 2011-07-06
          • 2021-04-22
          相关资源
          最近更新 更多