在矩阵中查找最小值的索引

时间:2016-04-01 18:15:13

标签: python matrix scipy

我有一个2-Dim数组,其中包含给定拟合的残差平方和(此处不重要)。

RSS[i,j] = np.sum((spectrum_theo - sp_exp_int) ** 2)

我想在矩阵中找到具有最小值AND其位置(i,j)的矩阵元素。找到最小元素就可以了:

RSS_min = RSS[RSS != 0].min()

但对于索引,我试过了:

ij_min = np.where(RSS == RSS_min)

给了我:

ij_min =  (array([3]), array([20]))

我想取而代之的是:

ij_min =(3,20)

如果我尝试:

ij_min = RSS.argmin()

我获得:

ij_min = 0,

这是错误的结果。

Scipy或其他地方是否存在可以执行此操作的函数?我在网上搜索过,但我发现只有1-Dim阵列的答案,而不是2-D-Dim。

谢谢!

3 个答案:

答案 0 :(得分:2)

这对你有用吗<​​/ p>

import numpy as np

array = np.random.rand((1000)).reshape(10,10,10)

print np.array(np.where(array == array.min())).flatten()

在多个最小值的情况下,您可以尝试类似

的内容
import numpy as np

array = np.array([[1,1,2,3],[1,1,4,5]])

print zip(*np.where(array == array.min()))

答案 1 :(得分:2)

基于您现在所拥有的最简单的修复方法就是从数组中提取元素作为最后一步:

# ij_min = (array([3]), array([20]))
ij_min = np.where(RSS == RSS_min)
ij_min = tuple([i.item() for i in ij_min])

答案 2 :(得分:1)

您可以将argminunravel_index合并。

例如,这是一个数组RSS

In [123]: np.random.seed(123456)

In [124]: RSS = np.random.randint(0, 99, size=(5, 8))

In [125]: RSS
Out[125]: 
array([[65, 49, 56, 43, 43, 91, 32, 87],
       [36,  8, 74, 10, 12, 75, 20, 47],
       [50, 86, 34, 14, 70, 42, 66, 47],
       [68, 94, 45, 87, 84, 84, 45, 69],
       [87, 36, 75, 35, 93, 39, 16, 60]])

使用argmin(返回一个整数作为展平数组中的索引),然后将其传递给unravel_index以及{{1}的形状将展平数组的索引转换为2D数组的索引:

RSS

In [126]: ij_min = np.unravel_index(RSS.argmin(), RSS.shape) In [127]: ij_min Out[127]: (1, 1) 本身可以用作ij_min的索引来获取最小值:

RSS