arg max of a matrix,index of maximum element

时间:2016-12-05 06:06:21

标签: python-3.x numpy

考虑下面的Python 3.5中我的numpy矩阵的图片。 A是一个形状为(35,50)的矩阵。

enter image description here

包含np.max(A)的行返回max的正确值,max在我的数据集中确实是2372。但是,当我尝试重现如下所示的numpy文档时:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.argmax.html

我没有得到与文档中的结果类似的结果。所有索引对都不同。我尝试了第一个索引对:A[18][29]但它是值为506的元素的索引,当我认为这只会返回矩阵最大值的索引时。这让我有两个问题:

  1. 如果这些索引对不是矩阵最大值的索引,即np.max(A),那么它们是什么?

  2. numpy有没有办法在矩阵中返回任何给定形状的实际元素的索引(我的形状是35,50)?理想情况下,如果我输入:A[row_index][column_index]我希望输出是一个等于np.max(A)的标量元素,在我的情况下,该值将是2372。

  3. 我不确定为什么它没有像我期望的那样工作,如果我不得不猜测,我会说它与数组中的数组有关,或者我只是没有使用正确的numpy扩展。

    请指教,

    谢谢

1 个答案:

答案 0 :(得分:1)

row_index是每列最大的索引,50列,50个索引。

col_index是每行最大值的索引,35个值。

在这两个数组中配对值是没有意义的。是的,其中一对将是整个数组最大值的索引,但你不能仅仅通过查看它们来判断。

========================

In [573]: x
Out[573]: 
array([[15,  8,  6,  3,  4,  5],
       [22,  1, 13, 10, 18,  7],
       [21, 14, 20, 16,  9,  2],
       [11, 12, 23, 19, 17,  0]])
In [574]: i0=np.argmax(x,axis=0)
In [575]: i1=np.argmax(x,axis=1)
In [576]: i0
Out[576]: array([1, 2, 3, 3, 1, 1], dtype=int32)
In [577]: i1
Out[577]: array([0, 0, 0, 2], dtype=int32)

要获取最大值,我们必须将这些索引与np.arange的正确形状结合起来。

In [578]: x[i0,np.arange(6)]
Out[578]: array([22, 14, 23, 19, 18,  7])
In [579]: x[np.arange(4),i1]
Out[579]: array([15, 22, 21, 23])

23存在于两者中,但不存在于同一索引

In [580]: np.argmax(x)
Out[580]: 20               # location in the flattened version of x
In [581]: x.flat[20]
Out[581]: 23
In [582]: x[i0[2], i1[3]]   # (3, 2)
Out[582]: 23

要将平面索引转换为2d,请使用:

In [583]: np.unravel_index(20,x.shape)
Out[583]: (3, 2)
In [584]: x[3,2]
Out[584]: 23