在矩阵中查找最小值的索引
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在矩阵中查找最小值的索引相关的知识,希望对你有一定的参考价值。
我有一个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。
谢谢!
答案
基于您现在所拥有的最简单的修复方法就是从数组中提取元素作为最后一步:
# ij_min = (array([3]), array([20]))
ij_min = np.where(RSS == RSS_min)
ij_min = tuple([i.item() for i in ij_min])
另一答案
这对你有用吗?
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()))
另一答案
你可以将argmin
与unravel_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
以上是关于在矩阵中查找最小值的索引的主要内容,如果未能解决你的问题,请参考以下文章