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 番目のベクトルは, (各列で2 番目に高い値を[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 を足したり引いたりして、matlab のように 1 ベースにすることができます。

@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 です。各 raw の最大インデックスが必要な場合は、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 に答える