2017-12-18 1 views
1

중심 서브 어레이를 검색 (N, N)을 형성하는 as_strided 및 I는 x의 주 대각선을 중심으로되는 형태 (n, n) 정사각형 서브 어레이를 검색하고자. 예를 들어, N = 3 & n = 2사용 NumPy와는 I 정사각형 어레이 <code>x</code>가 주 대각선

에 운영과
x = np.arange(9).reshape((3, 3)) 

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

방법 중 하나를 양보해야 할 것은 make_windows

def make_windows(a, sub_w, sub_h): 
    w, h = a.shape 
    a_strided = np.lib.stride_tricks.as_strided(
     a, shape=[w - sub_w + 1, h - sub_h + 1, 
        sub_w, sub_h], 
    strides=a.strides + a.strides) 
    return a_strided 

를 사용하고 np.einsum('ii...->i...', make_windows(x, 2, 2)) 같은 것을 할 것입니다,하지만 것 한 걸음 씩 그것을 청결하게하십시오. as_strided 혼자서 할 수 있습니까?

답변

3

물론 : 예를 들어

def diag_windows(x, n): 
    if x.ndim != 2 or x.shape[0] != x.shape[1] or x.shape[0] < n: 
     raise ValueError("Invalid input") 
    w = as_strided(x, shape=(x.shape[0] - n + 1, n, n), 
        strides=(x.strides[0]+x.strides[1], x.strides[0], x.strides[1])) 
    return w 

:

In [14]: x 
Out[14]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

In [15]: diag_windows(x, 2) 
Out[15]: 
array([[[ 0, 1], 
     [ 4, 5]], 

     [[ 5, 6], 
     [ 9, 10]], 

     [[10, 11], 
     [14, 15]]]) 

In [16]: diag_windows(x, 3) 
Out[16]: 
array([[[ 0, 1, 2], 
     [ 4, 5, 6], 
     [ 8, 9, 10]], 

     [[ 5, 6, 7], 
     [ 9, 10, 11], 
     [13, 14, 15]]]) 

In [17]: diag_windows(x, 4) 
Out[17]: 
array([[[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]])