Numpy:获取2D数组最小值的列和行索引

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.


Pad*_*ham 9

您可以使用np.unravel_index

print(np.unravel_index(x.argmin(), x.shape))
(2, 1)
Run Code Online (Sandbox Code Playgroud)