我正在试图找出最好的方法,最好是在Octave中,但是我会把NumPy放在紧要关头。
假设我有一个axb矩阵M.如果我想要任何给定列中最大值的行索引,[x, xi] = max(M)
将为我返回这些索引作为行向量。
例如,如果M是:
1 3 5
2 9 1
7 2 4
以上内容会将行向量[3 2 1]
作为xi
返回;每行索引的向量,包含该列的最大值。这很好。我想要这个行向量。
但是,如果我想要顶部 n 这样的行向量怎么办?
[编辑以便更好地解释]
对于上面的例子,第一个这样的向量将是上面的[3, 2, 1]
,(每个给定列具有最高值的行的索引)。第二个这样的向量是[2 1 3]
,(每列的第二高值的行的索引)。
我可以迭代地完成它,但是我的实际矩阵有数千行,所以这在计算上非常昂贵。我找不到任何明显的矩阵效用函数来帮助我实现这一目标。有什么建议吗?
答案 0 :(得分:5)
我认为你的意思是你想要矩阵中的n个最大值。在这种情况下,Get the indices of the n largest elements in a matrix几乎与此问题相同,只是OP需要整个矩阵的最大值,而不是单个最大值。这应该可以满足您的需求
n = 2; % The depth to get
M = [ 1, 3, 5; ...
2, 9, 1; ...
7, 2, 4 ]; % The matrix to look at
[m, mi] = sort(M, 'descend'); % Sort the to access them
x = m(1:n, :) % Get the values
xi = mi(1:n, :) % and the indices
答案 1 :(得分:2)
喜欢这个吗?
% N is the number of rows you want to include.
[x, xi] = max(a(1:N,:))
这会给你:
a =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
N = 3;
[x, xi] = max(a(1:N,:))
x =
16 11 10 13
xi =
1 2 2 1
答案 2 :(得分:2)
这是如何在numpy中做到这一点。请查看numpy.argmax
,它返回沿轴的最大值索引。请注意,此索引从0开始,因此您可能需要向其添加/减去1以使其基于1,如在matlab中那样。
以@Stewie Griffin为例: - )
In [3]: a = np.array([[16,2,3,13], [5,11,10,8], [9,7,6,12], [4,14,15,1]])
In [4]: N = 2 # A 0-based index
In [5]: np.argmax(a[N], axis=0)
Out[5]: array([0, 1, 1, 0])
此处轴为0,因为您希望每列中有最大索引。如果您想要每个原始数据中的最大索引,请将其更改为1。此外,如果你想要分钟,还有numpy.argmin
。
根据您的澄清,您希望每列中有第n个最大索引,numpy.argsort
非常容易。
In [11]: A = np.argsort(a, axis=0) # returns indices of smallest to largest values in each column
In [12]: A
Out[12]:
array([[3, 0, 0, 3],
[1, 2, 2, 1],
[2, 1, 1, 2],
[0, 3, 3, 0]])
In [13]: N = 1 # 0-based index
In [14]: A[N] # 2nd smallest indices
Out[14]: array([1, 2, 2, 1])
In [14]: A[-N-1] # 2nd largest indices
Out[14]: array([2, 1, 1, 2])