2017-02-10 12 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]]) 
関連する問題