2016-10-16 6 views
3

定数モードの場合、numanoパッド関数をtheanoに実装しようとしています。それはnumpyでどのように実装されていますか?そのパッドの値が配列numpyパッドの実装方法(定数値の場合)

a = np.array([[1,2,3,4],[5,6,7,8]]) 
# pad values are just 0 as indicated by constant_values=0 
np.pad(a, pad_width=[(1,2),(3,4)], mode='constant', constant_values=0) 

が、私は事前の次元数を知っていれば、私はちょうど作成することで、これを実装することができます今すぐ

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

を返す考えるとちょうど0

あると仮定新しい次元の新しい配列がパッドの値を埋め、この配列の対応する要素を埋めます。しかし、もし私が入力配列の寸法を知らないのであれば?入力配列から出力配列の次元を推測することはできますが、配列の次元数を知らなくてもインデックスを作成する方法はありません。または私は何かを逃していますか?

私は入力次元が、私は何ができる、3、言っていることがわかっている場合は、次のとおりです。

zeros_array[pad_width[0][0]:-pad_width[0][1], pad_width[1][0]:-pad_width[1][1], pad_width[2][0]:-pad_width[2][1]] = a 

ゼロ列が出力寸法で作成された新しい配列です。

しかし、手前のndimがわからない場合は、これを行うことはできません。換言すれば、

def ...(arg, pad): 
    out_shape = <arg.shape + padding> # math on tuples/lists 
    idx = [slice(x1, x2) for ...] # again math on shape and padding 
    res = np.zeros(out_shape, dtype=arg.dtype) 
    res[idx] = arg  # may need tuple(idx) 
    return res 

対象の配列を作成し、適切なインデックスタプルで入力をコピーします。

+0

'np.pad'のソースはhttps://github.com/numpy/numpy/blob/master/numpy/lib/arraypad.pyです。 – jmilloy

答えて

1

私の本能が行うことです。必要な形状とスライスを作成するには数学と繰り返しが必要ですが、面倒であれば簡単です。だから、

np.concatenate((np.zeros(padshape, dtype=arr.dtype), arr), axis=axis) 

(とappendは同様であろう):

それが軸上np.pad反復することが表示されますが(私が正しい代替識別した場合:

newmat = narray.copy() 
    for axis, ((pad_before, pad_after), (before_val, after_val)) \ 
      in enumerate(zip(pad_width, kwargs['constant_values'])): 
     newmat = _prepend_const(newmat, pad_before, before_val, axis) 
     newmat = _append_const(newmat, pad_after, after_val, axis) 

_prepend_constがどこにありますか。それぞれの寸法の前と後のピースを別々に追加しています。それが概念的には、それが最も速くなくても簡単です。

In [601]: np.lib.arraypad._prepend_const(np.ones((3,5)),3,0,0) 
Out[601]: 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1.]]) 

In [604]: arg=np.ones((3,5),int) 
In [605]: for i in range(2): 
    ...:  arg=np.lib.arraypad._prepend_const(arg,1,0,i) 
    ...:  arg=np.lib.arraypad._append_const(arg,2,2,i) 
    ...:  
In [606]: arg 
Out[606]: 
array([[0, 0, 0, 0, 0, 0, 2, 2], 
     [0, 1, 1, 1, 1, 1, 2, 2], 
     [0, 1, 1, 1, 1, 1, 2, 2], 
     [0, 1, 1, 1, 1, 1, 2, 2], 
     [0, 2, 2, 2, 2, 2, 2, 2], 
     [0, 2, 2, 2, 2, 2, 2, 2]]) 
関連する問題