2017-06-04 14 views
1

別の2次元配列を貼り付けて挿入することによって、2次元numpy配列内のブロックを変更しようとしています。以下のサンプルは予期しない動作をします:numpy配列内のブロックに値を代入する

import numpy as np 
M=np.ones((4,4)) 
print(M) 
S=[0,1] 
print('to be set to zero: ',M[S,:][:,S]) 
M[S,:][:,S]=np.zeros((2,2)) 
print('after setting to zero: ',M) 

私はMの左上隅がゼロになると予想します。しかし、私は得る

[[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.]] 
to be set to zero: [[ 1. 1.] 
[ 1. 1.]] 
after setting to zero: [[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.]] 

私は左上のブロックを抽出することができますが、それに書き込むことができるようだ。私は私が間違っているのは何

M[0:2,:][:,0:2]=np.zeros((2,2)) 

でライン

M[S,:][:,S]=np.zeros((2,2)) 

を交換する場合、私は期待される動作を取得しますか? あなたが

+1

高度なインデックスをnumpyの使用することができますありがとうございました。 – user2357112

+1

'M [S、:]'はコピーを作成します。 'M [0:2、:]'ビュー。 – hpaulj

答えて

2

あなたがコピー上のエントリを設定しているix_

M[np.ix_(S,S)]=0 

M 
Out[622]: 
array([[ 0., 0., 1., 1.], 
     [ 0., 0., 1., 1.], 
     [ 1., 1., 1., 1.], 
     [ 1., 1., 1., 1.]]) 
関連する問題