2017-06-04 36 views
1

我試圖通過插入粘貼另一個2-dim數組來更改二維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[S,:][:,S]=np.zeros((2,2)) 

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

我在做什麼錯? 謝謝

+1

你在副本上設置的條目。 – user2357112

+1

'M [S,:]'創建一個副本; 'M [0:2,:]'一種看法。 – hpaulj

回答

2

可以使用numpy的高級索引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.]])