2017-02-10 93 views
2
更换每行具体列索引

我尝试以下操作:NumPy的使用索引列表与南

a = np.array([[1,2,3], [4,5,6], [7,8,9]]) 

print a 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

a[np.arange(len(a)), [1,0,2]] = 20 #--Code1 

print a 
array([[ 1, 20, 3], 
     [20, 5, 6], 
     [ 7, 8, 20]]) 

但是,如果我的索引中他们有nan为:

a[np.arange(len(a)), [1,np.nan,2]] = 20 #--Code2 

它出错。

我想要做的是,如果索引中存在nan,请不要更改任何内容。

即我想要实现上述Code2,这样我可以得到如下:

array([[ 1, 20, 3], 
      [4, 5, 6], 
      [ 7, 8, 20]]) 

回答

1

使用masking -

m = ~np.isnan(idx) # Mask of non-NaNs 
row = np.arange(a.shape[0])[m] 
col = idx[m].astype(int) 
a[row, col] = 20 

其中,idx是索引数组。

采样运行 -

In [161]: a = np.array([[1,2,3], [4,5,6], [7,8,9]]) 

In [162]: idx = np.array([1,np.nan,2]) 

In [163]: m = ~np.isnan(idx) # Mask of non-NaNs 
    ...: row = np.arange(a.shape[0])[m] 
    ...: col = idx[m].astype(int) 
    ...: a[row, col] = 20 
    ...: 

In [164]: a 
Out[164]: 
array([[ 1, 20, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 20]])