2017-02-22 7 views
0

フーリエ解析私は1次元のnumpy配列に集めた5つのデータフィールドを出力しています:周波数ビン#、振幅、波長、正規化振幅、%出力。並べ替え用に複数のPython配列を構成する方法

データを整理して振幅を降順でソートするにはどうすればよいですか?ただ一つのデータフィールドでのテスト、私は次のように辞書を使用することができました

fourier_tuples = zip(range(len(fourier)), fourier) 
fourier_map = dict(fourier_tuples) 
import operator 
fourier_sorted = sorted(fourier_map.items(), key=operator.itemgetter(1)) 
fourier_sorted = np.argsort(-fourier)[:3] 

私の意図は、1行目に他の配列を追加することでしたが、これはdictsので、動作しません。 2つの用語だけを受け入れる。だからこそthis postは私の問題を解決しません。

これは妥当なアプローチですか、それとも&別々の配列を組み合わせる方が良いですか?最終的には、上位3つの周波数と関連する他のデータからデータ値を取り出し、それらを出力データファイルに書きたいと考えています。

fourier = np.array([1.77635684e-14, 4.49872050e+01, 1.05094837e+01, 8.24322470e+00, 2.36715913e+01]) 
freqs = np.array([0.  , 0.00246951, 0.00493902, 0.00740854, 0.00987805]) 
wavelengths = np.array([inf, 404.93827165, 202.46913583, 134.97942388, 101.23456791]) 
amps = np.array([4.33257766e-16, 1.09724890e+00, 2.56328871e-01, 2.01054261e-01, 5.77355886e-01]) 
powers% = np.array([4.8508237956526163e-32, 0.31112370227749603, 0.016979224022185751, 0.010445983875848858, 0.086141014686372669]) 

最後の4つの配列は「フーリエ変換」に対応した他のフィールドです:

は、ここに私のデータの抜粋です。 (実際の配列の長さは42ですが、簡単にするために5に減らしています)

+0

データを追加できますか? – Cleb

+1

アレイ? *リスト*を意味しますか?なぜあなたは 'dict'を使い、' items'を呼び出すのですか?それは意味をなさない... –

+0

は 'zip(範囲(len(フーリエ))、フーリエ)' '列挙(フーリエ)'の略ですか? –

答えて

1

あなたはnumpyを使用しているようですが、ここではこれを行う方法があります。あなたはあなたのポストの右機能np.argsortを持っているが、あなたはそれを正しく使用していないようです:

order = np.argsort(amplitudes) 

これが唯一のそれはあなたの手順に比べてシャッフル逆を計算し、あなたの辞書のトリックに似ています。 Btw。単純にタプルのリストではなく、辞書を使うのはなぜですか? order

内容は今orderの最初のセルはamplitudesの最小要素の位置が含まamplitudesに指標である、第二のセルは、従って

top5 = order[:-6:-1] 

は、データを提供した次等の位置を含みます1D numpyのarray sがあなたが高度なインデックスを使用して上位5 ampltiudesに対応する要素を抽出するためにtop5を使用することができます

freq_bin[top5] 
amplitudes[top5] 
wavelength[top5] 

あなたができる列でグループ化して欲しい、そして得られたN-によって-5アレイにtop5を適用した場合:

np.c_[freq_bin, amplitudes, wavelength, ...][top5, :] 
+0

私はnumpyを初めて使用しましたが、他の場所で見たアプローチを模倣していました。私はそれが最善の方法ではないことに驚かない。タプルがより合理的であれば、それほど良いことはありません。私は次のようなタプルを作成しました: 'fourier_tuples = zip(範囲(len(フーリエ))、周波数、波長、フーリエ、アンプ、パワー)'。上記のように 'top5'を作成し、 'fourier_tuples [top5]'を実行しました。 結果: "TypeError:1つの要素を持つ整数配列のみをインデックスに変換できます" – joechoj

+1

@joechoj元の試行の行に沿って作業したい場合は、タプルを意味しました。 '.items()'を呼び出すと、辞書のキーと値のペアがタプルに変換されますが、タプルのリストで2つだけをグループ化することができます。 - 私が答えに述べるように、あなたが私のアプローチを使いたいのであれば、高度なインデックス作成を理解しているので、numpy配列を使わなければなりません。最後の行の 'np.c _ [...]'はnumpyの意味でzipに相当します。 –

0

私が正しく理解していれば、あなたが同じ長さの5つの別々のリストを持っていて、ありますそのうちの1つに基づいてすべてをソートしようとしています。これを行うには、numpyを使うか、またはvanilla pythonでそれを行うことができます。私の頭の上から2つの例があります(ソートは2番目のリストに基づいています)。

あなたが望むか、リストで作業している場合は、 my_sorted_list.reverse()

EDITで所定の位置にそれを逆にすることができます場合は、その後、my_sorted_array = np.fliplr(my_sorted_array)で配列を反転させることができ

a = [11,13,10,14,15] b = [2,4,1,0,3] c = [22,20,23,25,24] #numpy solution import numpy as np my_array = np.array([a,b,c]) my_sorted_array = my_array[:,my_array[1,:].argsort()] #vanilla python solution from operator import itemgetter my_list = zip(a,b,c) my_sorted_list = sorted(my_list,key=itemgetter(1)) 

:最初のn個の値を取得するには

あなたは単にsliceという配列を@Paulが示唆しているのと同じようにしなければなりません。スライスは、start:stop:step(ステップを省略することができます)引数を指定することで、古典的なリストのスライシングと同様の方法で行われます。あなたのケースでは、上位5列については[:,-5:]となります。例のように、このような各列からトップ2の列を取ることができます上:

my_sliced_sorted_array = my_sorted_array[:,-2:] 

結果は以下のようになります。

array([[15, 13], 
     [ 3, 4], 
     [24, 20]]) 

はそれがお役に立てば幸いです。

+0

私はnumpyのソリューションが好きですが、それを動作させることはできません。あなたが提案したように私は 'my_flipped_array'を作成しました。先頭のx値だけを含むように配列を切り捨てることはできますか?結果はすべてインデックスを介してアクセスできるので、おそらく私はそれを行う必要はありません... – joechoj

+0

ああ、ありがとう。私は 'my_flipped_array [:] [:3]'を試していたので、データセット全体を返すことになりました。なぜこれがうまくいかないのでしょうか?対照的に、 'my_flipped_array [0] [:3]'は最初の配列から最初の3つの値を返します。 – joechoj

+0

誰でもこの回答を下落させてください、あなたは説明していただけますか?これは私にとって素晴らしいアプローチのようです...私はこれを使用して問題に遭遇するいくつかの理由はありますか?どういうわけか、@Paul Panzerの答えはいいですか? – joechoj

関連する問題