从数组派生索引值的其他方法

时间:2018-04-03 01:23:41

标签: python loops numpy

给出一个示例NumPy数组 a ,例如

array([[1, A, 3.00, 4, 5],
       [2, B, 4.00, 5, 6],
       [3, C, 5.00, 6, 7],
       [3, D, 6.00, 7, 8],
       [3, E, 7.00, 8, 9]])

我的目标是找到第一列中出现值3的索引,并选择最后一个索引值。

我可以想到两种不同的方法来收集列表中的索引值。

解决方案1:使用for循环

indx = []
for i in range(len(a)):
    if int(a[i,0]) == int(3):
        indx.append(i)
indx = indx[-1]

解决方案2:使用NumPy 其中

indx = np.where(a[:,0] == 3)
indx = indx[0]
indx = indx[-1]

然而,我倾向于找到解决问题的更好方法,这实际上有助于我学到更多。鉴于这样的问题,有没有人知道我不知道的任何其他解决方案?提前谢谢!

2 个答案:

答案 0 :(得分:2)

您的解决方案对您的任务效率低下有两个原因:

  1. 使用for循环,首先搜索到最后一个,而不是最后一个 第一。此外,您无需建立列表。
  2. 对于numpy.where,您在选择最终索引之前检索所有索引。
  3. 您可以通过从上到下搜索的自定义功能解决这两个问题。此外,您可以通过JIT编译来提高性能。

    from numba import jit
    import numpy as np
    
    arr = np.random.randint(0, 9, 100000)
    
    @jit(nopython=True)
    def indexer(arr, item):
        for idx, val in enumerate(arr[::-1]):
            if val == item:
                return len(arr) - idx - 1
    
    %timeit indexer(arr, 5)          # 2.52 µs
    %timeit np.where(arr==5)[0][-1]  # 454 µs
    

答案 1 :(得分:1)

除非有一个我没有考虑的更简单的内置,否则最简单的方法是反转数组的第一层并搜索第一次出现。

reversed_a = a[::-1]
for i, item in enumerate(reversed_a ):
    if int(item[0]) == 3:
        break
indx = len(a) - i  - 1