2

numpy を使用して、最初の行以外の行が最初の行の内容でソートされる正方行列を作成したいと思います。例えば:

import numpy as np
a = array([['','z','b','d'],
           ['b','2','5','7'],
           ['d','0','1','3'],
           ['z','3','9','2']])

戻る:

[['','z','b','d']
 ['z','3','9','2']
 ['b','2','5','7']
 ['d','0','1','3']]
4

2 に答える 2

2

これは別の方法です。実際に必要なのは最初の行に基づく行の並べ替えであると仮定します。

>>> a[[list(a[:, 0]).index(i) for i in a[0]]]
array([['', 'z', 'b', 'd'],
       ['z', '3', '9', '2'],
       ['b', '2', '5', '7'],
       ['d', '0', '1', '3']], 
       dtype='|S1')
于 2012-11-07T00:59:35.597 に答える
1

ディクショナリがおそらくより適切であるのに、なぜこのデータを numpy 配列に入れたいのかは不明です。おそらく、文字列の dtype は必要ないでしょう。

あなたの例では、おそらく文字列の最初の行のキーからソートしたいと考えています。配列に「正方形」の形式 (例: のようなスライスa[:, 2]) でアクセスする場合、これはすべての要素が文字列に変換されることを意味します。構造化された配列を使用すると、より適切な並べ替えを行うことができますが、a[:][2]. これは、データを文字列 dtype の配列に入れ'names'、値を dtype の整数として入れる構造化配列の例です'values'。の文字列で並べ替えを実行できます'names'

a = np.array([('b', [2, 5, 7]),
              ('d', [0, 1, 3]), 
              ('z', [3, 9, 2])],
              dtype=[('names', 'S1'),
                     ('values', '3int')])

名前と値のレコードに個別にアクセスできます。

>>> a['names']
array(['b', 'd', 'z'], 
      dtype='|S5')

>>> a['values']
array([[2, 5, 7],
       [0, 1, 3],
       [3, 9, 2]])

また、名前の辞書式ソートに基づいて値の配列をソートできます。

>>> a['values'][np.argsort(a['names'])]
array([[2, 5, 7],
       [0, 1, 3],
       [3, 9, 2]])

または、名前の別の順序を使用して配列を並べ替えるだけです。

>>> a['values'][np.argsort(['z', 'b', 'd'])]
array([[0, 1, 3],
       [3, 9, 2],
       [2, 5, 7]])
于 2012-11-06T23:07:16.280 に答える