给定一个示例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]
但是,我倾向于找到更好的方法来解决问题,这实际上可以帮助我学习更多。考虑到这样的问题,有人知道我不知道的其他解决方案吗?预先感谢!
您的解决方案效率低下的两个原因:
- 使用您的
for
循环,您从先到最后搜索,而不是最后搜索第一的。此外,您不必要地构建了一个清单。 - 对于
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