2

私は知ってnumpy.argsort()いますが、それが行うことは、特定の軸に沿ってソートされる配列内の要素のインデックスを返すことです。

私が必要とするのは、すべての値を N 次元配列で並べ替え、結果としてタプルの線形リストを作成することです。

このような:

>>> import numpy
>>> A = numpy.array([[7, 8], [9, 5]])
>>> numpy.magic(A)
[(1, 0), (0, 1), (0, 0), (1, 1)]

PS argsort の出力がこの配列について何を伝えようとしているのかさえ理解できません。

4

1 に答える 1

3

np.argsort(A)の各行をA別々にソートしています。例えば、

In [21]: np.argsort([[6,5,4],[3,2,1]])
Out[21]: 
array([[2, 1, 0],
       [2, 1, 0]])

代わりに、配列を値の 1 次元配列にフラット化し、それを argsort します。これは、axisパラメーターを次のように設定することで実行できますNone(これを指摘してくれた @Akavall に感謝します)。

In [23]: np.argsort(A, axis=None)
Out[23]: array([3, 0, 1, 2])

次に、np.unravel_indexを使用して、関連付けられているインデックスを で復元しAます。


In [14]: import numpy as np

In [15]: A = np.array([[7, 8], [9, 5]])   

In [4]: np.column_stack(np.unravel_index(np.argsort(A, axis=None)[::-1], A.shape))
Out[4]: 
array([[1, 0],
       [0, 1],
       [0, 0],
       [1, 1]])

NumPy バージョン 1.5.1 以前でnp.unravel_indexは、最初の引数に配列のようなオブジェクトが渡されると ValueError が発生することに注意してください。その場合、リスト内包表記を使用できます。

In [17]: [np.unravel_index(p, A.shape) for p in np.argsort(A, axis=None)[::-1]]
Out[17]: [(1, 0), (0, 1), (0, 0), (1, 1)]
于 2013-04-21T12:48:03.417 に答える