1

いくつかのデータポイントで構成されるデータファイルがあり、特定の順序でプロットしたいと思います。データファイルの例を次に示します。

cop   94.0528    313     441
cpr   225.172    726     747
ent   444.786    926     939
fsh   256.038    743     754
fsp   43.7764    340     356
pbp   343.708    825     834
rho   426.497    858     886
sca   342.431    427     872

私は現在、例を設定した方法でそれらを互いにすぐ下にプロットしています。Pythonスクリプト内のこれらのデータレコードの順序を指定された順序に変更するにはどうすればよいですか?私はすでにこれを配列に加工しようとしました。この質問では、matplotlibを使用して棒グラフのレコードのシーケンスを制御するにはどうすればよいですか?

それで、これから私が持っている次の質問は、まったく同じことをすることができますが、テキストベースのソートaarayを使用することですか?

だから私が入れるものはこのようなものになるでしょう:

posarray = (crp, 2), (cop,1)

編集:posarrayは、outputarrayのposarray[0]にテキストがあるレコードの位置を示します。crpは2番目の位置になり、copは最初の位置になります。

そしてそれが私に与えるものは

cop   94.0528    313     441
cpr   225.172    726     747

最良の方法は、ある種の挿入を使用することです。そうすれば、ソート配列内の項目について言及するのを忘れた場合、それは一番下に沈んでしまいます。

4

1 に答える 1

0

前の質問への回答で説明したように、インデックス作成のトリックを使用して、必要なことを達成できます。

配列のNumpy表現が次のようになっていると仮定しましょう。

a = array([('cop', 94.0528, 313, 441), ('cpr', 225.172, 726, 747),
           ('ent', 444.786, 926, 939), ('fsh', 256.038, 743, 754),
           ('fsp', 43.7764, 340, 356), ('pbp', 343.708, 825, 834),
           ('rho', 426.497, 858, 886), ('sca', 342.431, 427, 872)], 
          dtype=[('f0', '|S3'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<i8')])

最初の列のリストを簡単に取得できます。

>>> fields = list(a['f0'])

次に、必要に応じて順序付けされたフィールドのリストを定義します。次に例を示します。

>>> new_order = ['cpr', 'cop', 'ent', 'fsh', 'fsp', 'rho', 'pbp', 'sca']

メソッドとリスト内包表記を使用して、リストnew_order内のの各アイテムの位置を取得できます。fieldsindex

>>> indices = [fields.index(i) for i in new_order]
[1, 0, 2, 3, 4, 6, 5, 7]

(配列にはメソッドfieldsがないため、リストである必要がある理由を理解できます)index

それでおしまい。indicesこれで、リストを使用して配列を並べ替えることができます。

>>> a[indices]
array([('cpr', 225.172, 726, 747), ('cop', 94.0528, 313, 441),
       ('ent', 444.786, 926, 939), ('fsh', 256.038, 743, 754),
       ('fsp', 43.7764, 340, 356), ('rho', 426.497, 858, 886),
       ('pbp', 343.708, 825, 834), ('sca', 342.431, 427, 872)], 
      dtype=[('f0', '|S3'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<i8')])
于 2012-08-29T21:54:24.303 に答える