给出一个示例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]
然而,我倾向于找到解决问题的更好方法,这实际上有助于我学到更多。鉴于这样的问题,有没有人知道我不知道的任何其他解决方案?提前谢谢!
答案 0 :(得分:2)
您的解决方案对您的任务效率低下有两个原因:
for
循环,首先搜索到最后一个,而不是最后一个
第一。此外,您无需建立列表。numpy.where
,您在选择最终索引之前检索所有索引。您可以通过从上到下搜索的自定义功能解决这两个问题。此外,您可以通过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