矩阵中的前n行?

时间:2013-06-18 13:43:14

标签: matlab numpy octave

我正在试图找出最好的方法,最好是在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],(每列的第二高值的行的索引)。

我可以迭代地完成它,但是我的实际矩阵有数千行,所以这在计算上非常昂贵。我找不到任何明显的矩阵效用函数来帮助我实现这一目标。有什么建议吗?

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])