返回ndarray中变量和元素之间FIRST匹配索引的最快方法是什么?我看到numpy.where使用了很多,但返回所有索引。
match = 5000
zArray = np.array([[0,1200,200],[1320,24,5000],[5000,234,5230]])
>array([[ 0, 1200, 200],
[1320, 24, 5000],
[5000, 234, 5230]])
numpy.where(zArray==match)
>(array([1, 2], dtype=int64), array([2, 0], dtype=int64))
我喜欢返回的第一个索引,即只有[1,2]。但是numpy.where返回[1,2]和[2,0]
答案 0 :(得分:2)
您可以使用np.argwhere
将匹配的索引打包为2D数组,每行保存每个匹配的索引,然后索引到第一行,如下所示 -
np.argwhere(zArray==match)[0]
或者,使用argmax
的速度更快,以获得展平版本的第一个匹配的索引,并使用np.unravel_index
获得每个dim索引元组 -
np.unravel_index((zArray==match).argmax(), zArray.shape)
示例运行 -
In [100]: zArray
Out[100]:
array([[ 0, 1200, 5000], # different from sample for a generic one
[1320, 24, 5000],
[5000, 234, 5230]])
In [101]: match
Out[101]: 5000
In [102]: np.argwhere(zArray==match)[0]
Out[102]: array([0, 2])
In [103]: np.unravel_index((zArray==match).argmax(), zArray.shape)
Out[103]: (0, 2)
运行时测试 -
In [104]: a = np.random.randint(0,100,(1000,1000))
In [105]: %timeit np.argwhere(a==50)[0]
100 loops, best of 3: 2.41 ms per loop
In [106]: %timeit np.unravel_index((a==50).argmax(), a.shape)
1000 loops, best of 3: 493 µs per loop