我有以下情况。让我们定义一个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],没有明确的开始-结束。
答案 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)
它是D
中D[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