Python 求矩阵中最小值的索引
我有一个二维数组,包含给定拟合的剩余平方和(这里不重要) 我想找到具有最小值的矩阵元素及其在矩阵中的位置(I,j)。查找最小元素是否正常:Python 求矩阵中最小值的索引,python,matrix,scipy,Python,Matrix,Scipy,我有一个二维数组,包含给定拟合的剩余平方和(这里不重要) 我想找到具有最小值的矩阵元素及其在矩阵中的位置(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
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维数组,而不是2维或N维数组
谢谢 这对你有用吗
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()))
根据您目前的情况,最简单的修复方法是作为最后一步从数组中提取元素:
# ij_min = (array([3]), array([20]))
ij_min = np.where(RSS == RSS_min)
ij_min = tuple([i.item() for i in ij_min])
您可以将
argmin
与组合
例如,这里有一个数组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
(它返回一个整数,该整数是展开数组中的索引),然后将其与RSS
的形状一起传递到unravel_index
,以将展开数组的索引转换为二维数组的索引:
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
对我试过了:ij_min=RSS.argmin(),我得到了ij_min=0,这是不对的…
RSS.argmin()
不应该给你数组的元组;它应该给你一个整数,一个变平形式的RSS
的索引。你确定你发布的代码和输出是正确的吗?@user2357112你完全正确,我混合了不同的输入和输出。我已经编辑了上面的问题,完全没有。我得到了一个长长的索引列表,对我来说毫无意义。比如:[01 12 2 3 3 3 4 4 4 4 4 5 5 5 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 9 9 9 9…哦,是的,如果有多个最小值,我想它会很难打破…我会把它留在这里,因为有人对它投了更高的票,如果有人给出更好的答案,我会删除这个。@ariel67你能吗更新您的问题以指定在数组具有多个最小值的情况下应该发生什么?@John我不确定是否理解您的问题。您的意思是“如果矩阵中的两个元素具有相同的值,对应于最小值,该怎么办?”。在这种情况下,我希望得到这两个元素的索引,但鉴于我的数据的性质,这是一种非常不可能的情况。我已经尝试过。我得到一个错误:“ij_min=tuple([I.item()代表ij_min中的I]))NameError:name'ij_-min'未定义。由于我是Python新手,我可能遗漏了一些东西,不是吗?我应该在某个地方定义ij_-min吗?如何定义?这行代码假设您已经运行了前几行。我将编辑我的响应以澄清。这是在多个维度中对我有效的答案。谢谢!
In [128]: RSS_min = RSS[ij_min]
In [129]: RSS_min
Out[129]: 8