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

问题描述 投票:1回答:3

我有一个2-Dim数组,包含给定拟合的剩余平方和(这里不重要)。

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

我想找到矩阵元素的最小值和它在矩阵中的位置(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。

谢谢!

python matrix scipy
3个回答
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
投票

这对你有用吗?

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
投票

你可以将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的形状一起传递给RSS,以将展平数组的索引转换为2D数组的索引:

In [126]: ij_min = np.unravel_index(RSS.argmin(), RSS.shape)

In [127]: ij_min
Out[127]: (1, 1)

ij_min本身可以作为RSS的索引来获得最小值:

In [128]: RSS_min = RSS[ij_min]

In [129]: RSS_min
Out[129]: 8
© www.soinside.com 2019 - 2024. All rights reserved.