2016-10-16 12 views
3

상수 모드에서 theano에 numpy 패드 함수를 구현하려고합니다. 어떻게 numpy로 구현됩니까? 그 패드 값은 그냥이 사전의 크기의 수를 알고 있다면 이제numpy 패드 구현 방법 (상수 값)

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]]) 

을 반환 배열

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) 

을 감안할 때 0이

, 난 그냥 작성하여이를 구현할 수있는 가정 새 차원의 새 배열이 패드 값을 채우고이 배열의 해당 요소를 채 웁니다. 하지만 입력 배열의 크기를 모르는 경우에는 어떻게해야합니까? 입력 배열에서 출력 배열의 크기를 추측 할 수는 있지만 그 안에있는 차원의 수를 모른 채 색인을 생성 할 방법이 없습니다. 또는 나는 무엇인가 놓치고 있냐? I는 입력 차원, 3 말 것을 알고있는 경우이다

후 I는 할 수 : 제로 어레이 출력 크기로 만든 새로운 배열

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.pad 반복 (I 올바른 대안 발견 한 경우 :

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은 다음과 같습니다

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

(그리고 append 비슷한 것) 그래서. 각각의 사전 및 사후 조각을 각 차원에 대해 개별적으로 추가합니다. 가장 빠르지 않을지라도 개념적으로 간단합니다.

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]])