4

我试图找出最好的方法,最好是在 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]的行的索引)。

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

4

3 回答 3

5

我假设您的意思是您想要矩阵中的 n 个最大值。在这种情况下,获取矩阵中 n 个最大元素的索引几乎与此问题相同,除了 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
于 2013-06-18T14:03:49.950 回答
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
于 2013-06-18T13:48:04.027 回答
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])
于 2013-06-18T13:50:11.230 回答