web-dev-qa-db-ja.com

numpy 2D配列の列を並べ替える

Numpy 2D配列の列の順序を新しい任意の順序に変更する方法はありますか?たとえば、私は配列を持っています

array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])

に変更したい

array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])

順列を適用することにより

0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2

列に。したがって、新しいマトリックスでは、元の列の最初の列をそのままにしておき、2番目の列を最後の列に移動する、というようにしています。

それを行うnumpy関数はありますか?私はかなり大きな行列を持っているので、さらに大きな行列を取得することを期待しているので、可能な場合はこれをすばやく適切に実行するソリューションが必要です(順列行列は不要です)

ありがとうございました。

43
5xum

これは、ファンシーなインデックス作成を使用して可能です。

>>> import numpy as np
>>> a = np.array([[10, 20, 30, 40, 50],
...               [ 6,  7,  8,  9, 10]])
>>> your_permutation = [0,4,1,3,2]
>>> i = np.argsort(your_permutation)
>>> i
array([0, 2, 4, 3, 1])
>>> a[:,i]
array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])

これはコピーであり、ビューではないことに注意してください。 numpy配列がメモリ内でストライドされる方法のため、インプレース置換は一般的なケースでは不可能です。

67
wim

置換行列を元の行列にポスト乗算することにより、このための行列ベースのソリューションがあります。これにより、元のマトリックスの要素の位置が変更されます

import numpy as np

a = np.array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])

# Create the permutation matrix by placing 1 at each row with the column to replace with
your_permutation = [0,4,1,3,2]

perm_mat = np.zeros((len(your_permutation), len(your_permutation)))

for idx, i in enumerate(your_permutation):
    perm_mat[idx, i] = 1

print np.dot(a, perm_mat)
3
Parth Paritosh