numpy:获取二维数组最小值的列和行索引

NH

例如,

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

获取二维数组中每列的第二个最小值

在JavaScript中从二维数组获取最小值和最大值

如果最小值满足条件,则获取二维np.array中每一行的最小值索引。

Python中索引二维列表的最小值

LINQ查找二维锯齿状数组最小值,返回索引

如何在Java中获取二维数组列表的最大值/最小值

二维数组python上的最小值

如何在 Python 中找到二维数组的最小值和最大值

如何找到二维数组的最大值和最小值的位置

Python 查找最小值。二维数组中每一列的值

删除二维numpy数组的替代列和行

有没有办法找到二维NumPy数组中最大列值的UNIQUE行索引?

使用D3.js在最小值和最大值之间生成二维数组

获取二维 numpy 数组中最大点的索引

numpy在二维数组中获取范围的索引

在二维numpy数组的每一行中找到最小非零值

最小值最大值二维数组javascript

在二维数组中查找最小值/最大值

如何获取二维数组中指定列的唯一行的索引

生成二维 NumPy 数组的索引

如何在二维numpy矩阵中找到前n个最小值

Java在字符串的二维数组中查找最小值

PHP查找二维数组中最小值的键

二维数组主对角线上的最小值

过滤数组以获取二维数组 GoogleScripts 中列的最大值的行

从二维数组获取索引

excel在二维数组中匹配值(获取行)

根据一维数组获取二维numpy数组的索引

将一维数组转换为索引值的二维向量数组的 Pythonic/Numpy 方法