2012-01-20 19 views
2

Matlabの次の単純なコードのpyononicの実装と同等のものは何ですか?Python:多次元配列のマスキング

Matlabの:例えばB[i]=42ことがカラム5の位置2を設定すると認めるようにうまく機能


B = 2D array of integers as indices [1...100] 
A = 2D array of numbers: [10x10] 
A[B] = 0 

。 Pythonのでは、エラーが発生します。論理あるバウンドのうち。しかし、上記のMatlabコードをPythonに変換するには、Pythonの方法を探しています。 ものような高次元のための問題を考慮してください:


B = 2D array of integers as indices [1...3000] 
C = 3D array of numbers: [10x10x30] 
C[B] = 0 

我々はそれについて考えた一つの方法は、i,j代わりの絶対位置としてのインデックスの配列要素を改革することです。つまり、位置42divmod(42,m=10)[::-1] >>> (2,4)です。だからAの索引付けに簡単に使用できるインデックスのベクトルnx2 >>> ii,jjがあります。 Pythonで高次元でも効果的な方法であると考えました。

+0

を使用することができます論理的な「束縛」...これは何を引き起こすのでしょうか?あなたはPythonで試したことを見せてくれますか? –

+0

なぜ2D配列を別の2D配列のインデックスとして使用していますか? – 0605002

+1

@LaurenceGonsalves質問で述べたように、A.shape =(10,10)なので、A [42]によるインデックス作成は合法ではありません!これはMatlabコードでは42と2行目と4列目を自動的に一致させるためではありません。 – Developer

答えて

5

インデックス化する前に.ravel()を配列(A)に使用し、その後に.reshape()を使用することができます。

また、A.shapeを知っているため、インデックス付けする前にもう1つの配列(B)にnp.unravel_indexを使用できます。

例1:

>>> import numpy as np 
>>> A = np.ones((5,5), dtype=int) 
>>> B = [1, 3, 7, 23] 
>>> A 
array([[1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1]]) 
>>> A_ = A.ravel() 
>>> A_[B] = 0 
>>> A_.reshape(A.shape) 
array([[1, 0, 1, 0, 1], 
     [1, 1, 0, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 0, 1]]) 

例2:後に発見

>>> b_row, b_col = np.vstack([np.unravel_index(b, A.shape) for b in B]).T 
>>> A[b_row, b_col] = 0 
>>> A 
array([[1, 0, 1, 0, 1], 
     [1, 1, 0, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 0, 1]]) 

:外:あなたはそれがエラーを起こしPythonでは」numpy.put

>>> import numpy as np 
>>> A = np.ones((5,5), dtype=int) 
>>> B = [1, 3, 7, 23] 
>>> A.put(B, [0]*len(B)) 
>>> A 
array([[1, 0, 1, 0, 1], 
     [1, 1, 0, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 0, 1]]) 
+2

例をありがとう。私はあなたのソリューションをデモンストレーションしてみるつもりだった。投稿する前にあなたはしました。これらの例では、そのアイデアは現在明らかです。両方の方法が役立ちます。 – Developer