2017-03-22 26 views
2

相関行列から始めます。これはi番目とj番目の要素がi番目の要素とj番目の要素の間の相関関係にあることを意味します(したがって、対角線は1になります)。私は別の要素(1のリストが私の場合には役に立たないので、それ自身を含まない)で各要素の最大の相関関係を見出そうとしています。Python行列の各行で2番目に大きい要素を得る

1 0.7 0.4 0.1 
0.7 1 0.3 0.2 
0.4 0.3 1 0.5 
0.1 0.2 0.5 1 

上記のマトリックスがあるとします。私は
(最大相関、i番目の要素、j番目の要素)のようなものを持っています。上記のマトリックスで、私は結果として
[(0.7, 0, 1), (0.7, 1, 0), (0.5, 2, 3), (0.5, 3, 2)]
を取得したいと思います。

これについてはどのような良い方法がありますか?
私はパンダのデータフレームとして行列を持っています。インデックスと列の名前は同じです(現在は[0, 1, 2, 3])。現在、私は唯一の

D = {} 
for i in df.columns: 
    max = (0, 0, 0) 
    for j in df.columns: 
     if i==j: 
      continue 
     element = df.loc[i,j] 
     if element > max[0]: 
      max = (element, i, j) 
    D[i] = max 

ような何かをやって考えてきましたが、これは、より良い/より速く、そしてこれを改善することができます方法であっ内蔵されて行うことができますか?

+0

これを解決する方法が思いつきましたか?あなたが試したことを分かち合う。あなたがベストを学ぶ方法と、それがスタックオーバーフローでここに来るはずであることを学ぶ方法として、あなたが分かち合い、努力を示すことが重要です。この問題を解決する良い方法は、問題>あなたの努力>質問やその他の詳細です。研究努力は必須です。がんばろう。 –

+0

こんにちは!返信ありがとうございます。私は行ごとに(forループを入れ子にして)行ごとにループし、次にどの要素が2番目に大きいかを調べることを考えていましたが、やや非効率なようです。 – AsheKetchum

+0

行列が対称であるため、各列を反復することもできます。私は最高の相関の元のインデックスを取得したいので、私はそれを分類しないようにしています。 – AsheKetchum

答えて

0

私はアイデアのビットを使用して対角線をマイナスとkraskevichの両方の回答の-1のような比較的小さな値に変更しましたが、別の方法で終了しました。

maxCors = dfFinalCor.apply(lambda x: (max(x), x.idxmax(), x.name)).tolist() 

が、私はまた:)
を必要とするものを私に与え、私はよくここapply作品のように感じます。 (私は理由が分からないが、私は持っていなければジップを使用したくない)

1

これを試してみてください:

import numpy as np 

c = np.array([[1. , 0.7, 0.4, 0.1], 
       [0.7, 1. , 0.3, 0.2], 
       [0.4, 0.3, 1. , 0.5], 
       [0.1, 0.2, 0.5, 1. ]]) 
c -= np.eye(c.shape[0]) # remove the 1 on diagonal 
result = np.array([[np.max(row), num_row, np.argmax(row)] for num_row, row in enumerate(c)]) 

の私の理解からあなたは、私はあなたが常にいくつかの対称実数値の二次相関行列cとその対角線上にその値1を持っていることを仮定している相関関係に何を意味しますかあなたはこの斜めのエントリを気にしないので、私はただそれをキャンセルしています。次は、リスト内の相関行列のすべての行について繰り返します。すべての行について、最大値と最大値のインデックスはそれぞれnp.maxnp.argmaxであり、結果が得られます。配列を使用したくない場合は、代わりにresult = [(np.max(row), num_row, np.argmax(row)) for num_row, row in enumerate(c)](または@ kerkekevich result = list(zip(np.max(c, axis=1), np.arange(c.shape[0]), np.argmax(c, axis=1)))の解決策を参考にしてください)を使用して、正確に予想される出力を得ることができます。

+1

私は、相関係数が負になりうるので、対角の値を '-1'よりも小さく、' 0 'と同じではない値に設定する方が安全だと思います。 – kraskevich

+0

私はそれを知らなかった。その場合、あなたは正しいです。とにかく、対角値を上書きするのではなく、相関行列のコピーを使用する方が良いかもしれません。 – Michael

1

まず、相関係数より小さな値で対角線を塗りつぶすことができます。それを行うための標準的なnumpy機能があります:

np.fill_diagonal(df.values, -2.) 

その後あなただけの各列の最大値とそのインデックスを見つける必要がある(DataFrameは両方を計算するための方法を持っている)し、結果のZIPファイルを作成します。

list(zip(df.max(), df.columns, df.idxmax())) 
+0

私が理解していることを確認するために、このソリューションは列ごとに繰り返しますが、マイケルは行ごとに繰り返します。パフォーマンスをどのように比較していますか? – AsheKetchum

+0

はい、フードの下の列を反復処理します(すべての要素を見ることなく最大値を見つけることは不可能です)。パフォーマンスを比較する最良の方法は、必要なデータに対する両方のソリューションの時間を測定することです(これはまだ行っていません)。 – kraskevich

関連する問題