【问题标题】:Python: How to index the elements of a numpy array?Python:如何索引 numpy 数组的元素?
【发布时间】:2015-08-15 14:01:31
【问题描述】:

我正在寻找一个函数,它可以执行以下假设代码中的函数 indices 所做的事情:

indices( numpy.array([[1, 2, 3], [2, 3, 4]]) )

{1: [(0,0)], 2: [(0,1),(1,0)], 3: [(0,2),(1,1)], 4: [( 1,2)]}

具体来说,我想生成一个字典,其键是展平数组中的唯一元素,其值是相应键的完整索引的列表。

我查看了where 函数,但它似乎没有为大型数组提供解决此问题的有效方法。最好的方法是什么?

注意:我使用的是 Python 2.7

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    鉴于您想要的输出是字典,我认为不会有一种有效的方法来使用 NumPy 操作来做到这一点。你最好的选择可能是这样的

    import collections
    import itertools
    
    d = collections.defaultdict(list)
    for indices in itertools.product(*map(range, a.shape)):
        d[a[indices]].append(indices)
    

    【讨论】:

    • 我必须将itertools.product(a.shape) 更改为itertools.product(*map(range, a.shape)),否则这似乎可行;谢谢!
    【解决方案2】:

    numpy_indexed 包可以高效且完全矢量化的方式执行此类分组操作,即:

    import numpy_indexed as npi
    a = np.array([[1, 2, 3], [2, 3, 4]])
    keys, values = npi.group_by(a.reshape(-1), np.indices(a.shape).reshape(-1, a.ndim))
    

    【讨论】:

      【解决方案3】:

      我不了解 numpy,但如果仅使用数组,这是一个示例解决方案:

      arrs = [[1, 2, 3], [2, 3, 4]]
      dict = {}
      
      for i in range(0, len(arrs)):
          arr = arrs[i]
          for j in range(0, len(arr)):
              num = arr[j]
              indices = dict.get(num)
              if indices is None:
                  dict[num] = [(i, j)]
              else:
                  dict[num].append((i, j))
      

      【讨论】:

      • 这很好,但我怀疑它的性能不如 user2357112 的解决方案;不过,更重要的是,这不适用于任意深度的数组,例如[[[0], [5]], [[10], [15]], [[20], [25]]]。这些由 numpy 支持,所以我想包括它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2022-01-08
      • 2016-05-24
      • 2018-07-10
      • 1970-01-01
      • 2013-08-07
      • 2023-03-14
      相关资源
      最近更新 更多