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関数はありますか?私はかなり大きな行列を持っているので、さらに大きな行列を取得することを期待しているので、可能な場合はこれをすばやく適切に実行するソリューションが必要です(順列行列は不要です)
ありがとうございました。
これは、ファンシーなインデックス作成を使用して可能です。
>>> 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配列がメモリ内でストライドされる方法のため、インプレース置換は一般的なケースでは不可能です。
置換行列を元の行列にポスト乗算することにより、このための行列ベースのソリューションがあります。これにより、元のマトリックスの要素の位置が変更されます
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)