考虑下面的Python 3.5中我的numpy矩阵的图片。 A是一个形状为(35,50)的矩阵。
包含np.max(A)
的行返回max的正确值,max在我的数据集中确实是2372。但是,当我尝试重现如下所示的numpy文档时:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.argmax.html
我没有得到与文档中的结果类似的结果。所有索引对都不同。我尝试了第一个索引对:A[18][29]
但它是值为506的元素的索引,当我认为这只会返回矩阵最大值的索引时。这让我有两个问题:
如果这些索引对不是矩阵最大值的索引,即np.max(A)
,那么它们是什么?
numpy有没有办法在矩阵中返回任何给定形状的实际元素的索引(我的形状是35,50)?理想情况下,如果我输入:A[row_index][column_index]
我希望输出是一个等于np.max(A)
的标量元素,在我的情况下,该值将是2372。
我不确定为什么它没有像我期望的那样工作,如果我不得不猜测,我会说它与数组中的数组有关,或者我只是没有使用正确的numpy扩展。
请指教,
谢谢
答案 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