2017-06-04 67 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.]])