0

我有以下情况。让我们定义一个 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)

到目前为止一切正常。现在我想执行相同的过程,但仅针对列 j 上的矩阵 D 的行子集(为简单起见,我们将其固定不变)。我试过这个

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) 的索引。任何想法?我已经看到了一些方法,但我认为应该存在一些简单的方法来做到这一点?

请注意,它与此问题不同,因为行的子集并不总是 [1,2,3] 或 [5,6,7]。我的示例解决了一个通用子集,例如,[2,7,3,4] 没有明确的开始 - 结束。

4

2 回答 2

0

我可以看到矩阵 D 声明是错误的,它应该是 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]])

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

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

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

这将打印需要的结果,您可以参考在此处输入链接描述

于 2019-07-01T09:57:33.610 回答
0

有点解决方法,但它可以让您获得所需的索引D

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

给我们最大值:58

使用这些信息,我们搜索Dwith中的所有值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)

D这是从中最大值的索引D[a,j]


使用@Georgy链接建议的链接更新:

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

2如果您只想要最大值的行索引,则输出为。

于 2019-07-01T09:46:46.317 回答