如何在python中的np.matrix元素上使用argmin和argmax函数?

时间:2019-07-01 09:20:21

标签: python numpy argmax

我有以下情况。让我们定义一个D(8,4)矩阵:

import numpy as np
import random

D=np.matrix([[72 22 58 63]
            [28 22 32 20]
            [40 41 58 20]
            [22 58 22 41]
            [28 78 51 45]
            [58 61 28 71]
            [51 22 28 51]
            [22 63 54 22]])

让我们设置一个随机列:

j=np.random.choice(range(4))

我们将此值保存在一个空列表Sp中。

Sp=[]
Sp.append(j)

我想确定矩阵D在此列上的最大值的索引。

z=D[:,j].argmax(axis=0)

到目前为止,一切正常。现在,我只想对矩阵D在列j上的行的子集进行相同的处理(为简单起见,让它保持不变)。我尝试过了

j=2                      #COLUMN.
a=[1,2,3,4]              #SUBSET OF ROWS TO CHECK.
z=D[a,j].argmax(axis=0)

问题是返回的索引不是谁对应于矩阵D中的元素,而是矩阵D [a,j]中的索引。结果应该是z = 2,它对应于值58,但是,返回的值是z = 1,它是值58的位置,但在矩阵D [a,j]中。

[[32]
 [58]
 [22]
 [51]]

执行此过程时,我需要相对于原始矩阵(D)的索引。任何想法?我已经看到了一些方法,但是我认为应该有一些简单的方法来做到这一点?

请注意,它与this question不同,因为行的子集并不总是[1,2,3]或[5,6,7]。我的示例针对的是通用子集,例如[2,7,3,4],没有明确的开始-结束。

2 个答案:

答案 0 :(得分:0)

一些解决方法,但是它可以在D中获得所需的索引:

j = 2
a = [1, 2, 3, 4]
z = D[a, j].max()

为我们提供了最大值:58

利用此信息,我们用D搜索58中的所有值,并创建一个具有所有最大值的索引的新数组:

arr = np.where(D == 58)
w = np.array(list(zip(*arr)))

这使我们:

array([[0, 2],
       [2, 2],
       [3, 1],
       [5, 0]], dtype=int64)

现在,我们使用以下内容检查范围a, j中的可能索引:

i = np.array(list(zip([j for _ in range(len(a))], a))) # array([[2, 1],
                                                       #        [2, 2],
                                                       #        [2, 3],
                                                       #        [2, 4]])
w[w == i]

输出为:

array([2, 2], dtype=int64)

它是DD[a,j]中最大值的索引


更新,并带有@Georgy link的建议链接:

arr = np.where(D == 58)
arr[0][D[a,j].argmax()]

如果只希望最大值的行索引,则输出为2

答案 1 :(得分:0)

我可以看到矩阵D声明是错误的,应该是     将numpy导入为np     随机导入

D=np.matrix([[72, 22, 58, 63],
             [28, 22, 32, 20],
             [40, 41, 58, 20],
             [22, 58, 22, 41],
             [28, 78, 51, 45],
             [58, 61, 28, 71],
             [51, 22, 28, 51],
             [22, 63, 54, 22]])

要使用argmax或argmin的正确方法是

j=np.random.choice(range(4))
Sp=[]
Sp.append(j)

z = np.argmax(D[:,j], axis=0)
print(z)

这将打印所需结果 您可以参考enter link description here