2016-08-26 6 views
1

"A"という名前の2次元のnumpy配列(または数学の行列)があるとします。最初の行と別の行 "n"を入れ替えたいとします。 nは任意の自然数でよい。次のコードでは、しかし、私がしたいことは、私が考えたPython 3では、2次元の配列を2つのサブ配列にスワップする方法はありますか?

A = 
    0, 0, 1 
    0, 1, 0 
    1, 0, 0 

です(私は簡単にするために行列形式のAを表示する)ことができます

A = 
    0, 0, 1 
    0, 1, 0 
    0, 0, 1 

を見ることができます

A = np.eye(3) 
n = 2 
A[0], A[n] = A[n], A[0] 
print(A) 

動作しません。 1つの解決策は、「A」に等しい別のマトリックス「B」を導入するが、「A」および「B」は異なるオブジェクトである。それは、効率的な計算の場合、この

A = np.eye(3) 
B = np.eye(3) 
A[0], A[n] = B[n], B[0] 

これはA.上の正しいスワップを与えることができます。しかし、それは追加の行列「B」を必要とする操作を行い、私は知りません。それとももっと良いアイデアがありますか?感謝:)

+0

A [[0、n]] = A [[n、0]] ' – hpaulj

答えて

3

一覧スワッピングは参照渡して変数を入れ替えます。したがって、値で従来のスワップを使用して内部要素交換を行うことはできません。a,b=b,a

ここで内部リストの変更を行うことができます。これは、上書きの問題を解消するものです。

コード:

import numpy as np 
A = np.eye(3) 
n = 2 
A[[0,n]] = A[[n,0]] 
print(A) 

出力:numpyのアレイの

[[ 0. 0. 1.] 
[ 0. 1. 0.] 
[ 1. 0. 0.]] 
+0

私の問題を解決してください。ありがとう:) – aura

1

はこれを試してみてください:

import numpy as np 

A = np.eye(3) 
A[[0, 2]] = A[[2, 0]] 
print(A) 
1

サブアレイまたはスライスは、データではなく、コピーのビューを作成します。場合によっては、numpyがこれを検出してデータの破損を防ぐことができます。しかし、numpyは、スワップのためにpythonイディオムを使用すると検出できません。スワップする前に少なくとも1つのビューをコピーする必要があります。

tmp = A[0].copy() 
A[0] = A[n] 
A[n] = tmp 

アレイ内のデータの大部分を変更していることを考えれば、新しいアレイを完全に作成する方が簡単かもしれません。

indices = np.arange(n+1) 
indices[0], indices[n] = indices[n], indices[0] # this is okay as indices is a 1-d array 
A = A[indices] 
関連する問題