N. *_* H. 5 python arrays numpy
例如,
x = array([[1,2,3],[3,2,5],[9,0,2]])
some_func(x) gives (2,1)
Run Code Online (Sandbox Code Playgroud)
我知道可以通过自定义函数来实现:
def find_min_idx(x):
k = x.argmin()
ncol = x.shape[1]
return k/ncol, k%ncol
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有一个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
Run Code Online (Sandbox Code Playgroud)
似乎自定义函数实际上比unravel_index()和where()更快.unravel_index()执行与自定义函数类似的操作以及检查额外参数的开销.where()能够返回多个索引,但是对于我的目的而言要慢得多.也许纯粹的python代码并不是那么简单,只做两个简单的算术,自定义函数方法就像人们可以获得的那样快.
Anz*_*zel 12
你可以使用np.where:
In [9]: np.where(x == np.min(x))
Out[9]: (array([2]), array([1]))
Run Code Online (Sandbox Code Playgroud)
另外,正如@senderle在评论中提到的,要获取数组中的值,您可以使用np.argwhere:
In [21]: np.argwhere(x == np.min(x))
Out[21]: array([[2, 1]])
Run Code Online (Sandbox Code Playgroud)
由于OP的时间显示,并且更加清晰argmin(没有重复的分钟等),我认为可能会略微改进OP的原始方法的一种方法是使用divmod:
divmod(x.argmin(), x.shape[1])
Run Code Online (Sandbox Code Playgroud)
定时他们,你会发现额外的速度,不多但仍然是一个改进.
%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
Run Code Online (Sandbox Code Playgroud)
如果你真的关心性能,你可以看一下cython.
您可以使用np.unravel_index
print(np.unravel_index(x.argmin(), x.shape))
(2, 1)
Run Code Online (Sandbox Code Playgroud)