2017-10-02 13 views
1

1行あたり1つのセルを定義するマスクを使用して、numpy行列に挿入しようとしています。効果的には、各行に値を挿入していますが、異なる列を使用しています。私は成功せずnp.insert()を使用しようとしました:私は試してみて、xマスクに基づいて挿入Numpy:各行の異なる列に値を挿入します。

>>> x 
array([[False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False]], dtype=bool) 
>>> y = np.arange(25).reshape(5,5) 
>>> y 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 
>>> np.insert(y, np.where(x)[1], 99, axis=1) 
array([[ 0, 1, 99, 99, 99, 99, 99, 2, 3, 4], 
     [ 5, 6, 99, 99, 99, 99, 99, 7, 8, 9], 
     [10, 11, 99, 99, 99, 99, 99, 12, 13, 14], 
     [15, 16, 99, 99, 99, 99, 99, 17, 18, 19], 
     [20, 21, 99, 99, 99, 99, 99, 22, 23, 24]]) 

いつでも、それが値を複製終わります。

また、マスクは、単純な列ではない方法でセットアップされる可能性があります。

>>> x = np.zeros((5, 5), dtype=bool) 
>>> x[1:, 2] = True 
>>> x[0, 1] = True 
>>> x 
array([[False, True, False, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False]], dtype=bool) 

その後で、私は単に挿入するインデックスとして特定の列を指定することができないことを意味:

>>> np.insert(y, 2, [99, 99, 99, 99, 99], axis=1) 
array([[ 0, 1, 99, 2, 3, 4], 
     [ 5, 6, 99, 7, 8, 9], 
     [10, 11, 99, 12, 13, 14], 
     [15, 16, 99, 17, 18, 19], 
     [20, 21, 99, 22, 23, 24]]) 

が所望の出力は次のようになります。

array([[ 0, 99, 1, 2, 3, 4], 
     [ 5, 6, 99, 7, 8, 9], 
     [10, 11, 99, 12, 13, 14], 
     [15, 16, 99, 17, 18, 19], 
     [20, 21, 99, 22, 23, 24]]) 

どれを例えば助けが大いに評価されるだろう!

+0

したがって、マスクには行ごとに真の値が1つだけありますか? – Divakar

+0

正しい。行ごとに1つのTrue値しか存在しません。難しい部分は、他のTrue値とは異なる列にある可能性があることです。 – SortingHat

答えて

1

アプローチ#1: -

def insert_one_per_row(arr, mask, putval): 
    mask_ext = np.column_stack((mask, np.zeros((len(mask),1),dtype=bool))) 
    out = np.empty(mask_ext.shape, dtype=arr.dtype) 
    out[~mask_ext] = arr.ravel() 
    out[mask_ext] = putval 
    return out 

サンプル実行 -

In [91]: insert_one_per_row(y, x, putval=[-1,-2,-3,-4,-5]) 
Out[91]: 
array([[ 0, -1, 1, 2, 3, 4], 
     [ 5, 6, -2, 7, 8, 9], 
     [10, 11, 12, 13, -3, 14], 
     [-4, 15, 16, 17, 18, 19], 
     [20, 21, -5, 22, 23, 24]]) 

-

In [88]: y 
Out[88]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

In [89]: x 
Out[89]: 
array([[False, True, False, False, False], 
     [False, False, True, False, False], 
     [False, False, False, False, True], 
     [ True, False, False, False, False], 
     [False, False, True, False, False]], dtype=bool) 

In [90]: insert_one_per_row(y, x, putval=99) 
Out[90]: 
array([[ 0, 99, 1, 2, 3, 4], 
     [ 5, 6, 99, 7, 8, 9], 
     [10, 11, 12, 13, 99, 14], 
     [99, 15, 16, 17, 18, 19], 
     [20, 21, 99, 22, 23, 24]]) 

我々はまた、行ごとに異なる値を割り当てることができますここboolean-indexingで一つの方法ですアプローチ2:そのように私たちは、マスク上の平坦化Trueの場所を取得し、それらの場所で入力配列の平坦化されたバージョンにnp.insertに新しい値を挿入します -

def insert_one_per_row_v2(arr, mask, putval): 
    idx = np.flatnonzero(mask) 
    return np.insert(arr.ravel(), idx, putval).reshape(arr.shape[0],-1) 
0

実は、あなたがnp.where

np.where(x, np.full_like(y, 99), y) 
を使用することができます

そして、ここでは、出力されます。

In [9]: x 
Out[9]: 
array([[False, True, False, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False]], dtype=bool) 

In [10]: y 
Out[10]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

In [11]: np.where(x, np.full_like(y, 99), y) 
Out[11]: 
array([[ 0, 99, 2, 3, 4], 
     [ 5, 6, 99, 8, 9], 
     [10, 11, 99, 13, 14], 
     [15, 16, 99, 18, 19], 
     [20, 21, 99, 23, 24]]) 

おかげ

+0

実際には、これらのインデックスの値が上書きされるようです。それは主に私が探しているものですが、私は上書きしたくありません。私は挿入するためにそのインデックスを使用したい。 – SortingHat

+0

次に、@ Divakarの答えを試してください – rojeeer

関連する問題