0

列ごとに同じタイプを含むそのようなタイプの(より広い)行列をソートしたいのですが、各列は異なるタイプを持っている可能性があります。この並べ替えは、行のすべての列が一緒にとどまるように実行する必要がありますが、行は定義された列の値に従って順序付けられます

[ 
[1, 0, 0.25,'ind1', 'pop2', 0.56],
[2, 0, 0.35,'ind2', 'pop2', 0.58],
[1, 0, 0.23,'ind1', 'pop1', 0.66],
...
]

ここでは、列2(浮動小数点列)によるソートアルゴリズムを実行します。

[ 
[1, 0, 0.23,'ind1', 'pop1', 0.66],
[1, 0, 0.25,'ind1', 'pop2', 0.56],
[2, 0, 0.35,'ind2', 'pop2', 0.58],
...
]

列にcharタイプが含まれている場合、変更されましたか?ヘルプとアドバイスに感謝しますが、lexsort、sort、argsortをチェックしました...しかしおそらく間違った方法で。編集:理由はわかりませんが、行列がnumpy.matrix()として定義されている場合、argsort()メソッドは次元を追加します(したがって、3次元の結果)。これは、行列がnumpy.array(を使用して定義されている場合は発生しません。 )。それがさらなる読者を助けることができるならば。

4

1 に答える 1

1

データ型に名前付きフィールドがある場合は、並べ替えるフィールド名を「order」引数で指定して、numpy.sortを使用できます。

import numpy 

fieldTypes = ['i4', 'i4', 'f8', 'S4', 'S4', 'f8'] # data types of each field
fieldNames = ['a', 'b', 'c', 'd', 'e', 'f'] # names of the fields, feel free to give more descriptive names

myType = numpy.dtype(zip(fieldNames, fieldTypes)) # Create a numpy data type based on the types and fields

a = numpy.array([(1, 0, 0.25,'ind1', 'pop2', 0.56),
(2, 0, 0.35,'ind2', 'pop2', 0.58),
(1, 0, 0.23,'ind1', 'pop1', 0.66)], dtype=myType) # Create the array with the right dtype

print numpy.sort(a, order=['c']) # sort based on column 'c'

空のバッファを作成する場合、または既存のファイル/バッファからnumpyデータをロードする場合でも、名前付きフィールドを使用してdtypeに変換できることに注意してください。

名前付きフィールドがない場合は、この回答が役立ちます。@SteveTjoaが提案したアプローチをお勧めします。

a[a[:,1].argsort()] # Replace 1 with the index you need
于 2013-02-13T14:48:00.943 に答える