例如,
x = array([[1,2,3],[3,2,5],[9,0,2]])
some_func(x) gives (2,1)
我知道可以通过自定义函数来做到这一点:
def find_min_idx(x):
k = x.argmin()
ncol = x.shape[1]
return k/ncol, k%ncol
但是,我想知道是否有一个numpy内置函数可以更快地完成此任务。
谢谢。
编辑:感谢您的答案。我测试了它们的速度,如下所示:
%timeit np.unravel_index(x.argmin(), x.shape)
#100000 loops, best of 3: 4.67 µs per loop
%timeit np.where(x==x.min())
#100000 loops, best of 3: 12.7 µs per loop
%timeit find_min_idx(x) # this is using the custom function above
#100000 loops, best of 3: 2.44 µs per loop
似乎自定义函数实际上比unravel_index()和where()更快。unravel_index()的功能与自定义函数相似,另外还要检查额外参数。where()能够返回多个索引,但对于我而言,它的速度明显慢。纯粹的python代码执行两个简单的算术并没有那么慢,而自定义函数方法却可以做到最快。
您可以使用np.where
:
In [9]: np.where(x == np.min(x))
Out[9]: (array([2]), array([1]))
就像评论中提到的@senderle一样,要获取数组中的值,您可以使用np.argwhere
:
In [21]: np.argwhere(x == np.min(x))
Out[21]: array([[2, 1]])
正如OP的时间所显示的那样,并且它需要更清晰argmin
(没有重复的分钟数等),我认为可以稍微改善OP的原始方法的一种方法是使用divmod
:
divmod(x.argmin(), x.shape[1])
对它们进行计时,您会发现额外的速度点虽然不多,但仍然有所改进。
%timeit find_min_idx(x)
1000000 loops, best of 3: 1.1 µs per loop
%timeit divmod(x.argmin(), x.shape[1])
1000000 loops, best of 3: 1.04 µs per loop
如果您真的很关心性能,可以看看cython。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句