从数组中得出索引值的其他方法



给定一个示例numpy array 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:使用一个用于循环

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]

但是,我倾向于找到更好的方法来解决问题,这实际上可以帮助我学习更多。考虑到这样的问题,有人知道我不知道的其他解决方案吗?预先感谢!

您的解决方案效率低下的两个原因:

  1. 使用您的for循环,您从先到最后搜索,而不是最后搜索第一的。此外,您不必要地构建了一个清单。
  2. 对于numpy.where,您可以检索 ash liever 在选择最终的索引之前。

您可以通过自定义功能解决这两个问题,该功能从最后到第一个搜索。此外,您可以通过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

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

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

相关内容

最新更新