2014-10-30 2 views
1

3D 배열의 여러 하위 배열을 가져오고 싶습니다. I 스택의 포스트에서 발견 된 기능이 2 차원 경우의 어레이를 분할 할 수Python - 3D 배열의 "하위 배열"가져 오기

def blockshaped(arr, nrows, ncols): 
    h, w = arr.shape 
    return (arr.reshape(h//nrows, nrows, -1, ncols) 
       .swapaxes(1,2) 
       .reshape(-1, nrows, ncols)) 

하고 그래서 차원 배열의 경우에 확장하고자, 2D 같은 형태 블록 arrray하지만 제 차원의 각 슬라이스에 . 나는 예를 들어

...는 "루프"하지만 나던 작업으로 시도 :

import numpy as np 

#2D case (which works) 

test=np.array([[ 2., 1., 1., 1.], 
     [ 1., 1., 1., 1.], 
     [ 3., 1., 1., 1.], 
     [ 1., 1., 1., 1.]]) 

def blockshaped(arr, nrows, ncols): 

    h, w = arr.shape 
    return (arr.reshape(h//nrows, nrows, -1, ncols) 
       .swapaxes(1,2) 
       .reshape(-1, nrows, ncols)) 


sub = blockshaped(test, 2,2) 

그리고 4 "서브 어레이"얻을 :

array([[[ 2., 1.], 
     [ 1., 1.]], 

     [[ 1., 1.], 
     [ 1., 1.]], 

     [[ 3., 1.], 
     [ 1., 1.]], 

     [[ 1., 1.], 
     [ 1., 1.]]]) 

을하지만 3D 배열 등을위한 입력 : 그래서 여기

test2=np.array([[[ 2., 1., 1., 1.], 
     [ 1., 1., 1., 1.], 
     [ 3., 1., 1., 1.], 
     [ 1., 1., 1., 1.]], 

     [[ 5., 1., 1., 1.], 
     [ 1., 1., 1., 1.], 
     [ 2., 1., 1., 1.], 
     [ 1., 1., 1., 1.]]])  

나는 ... 같은 분해를 좋아하지만 2 "조각"에있는 것

def blockshaped(arr, nrows, ncols): 

    h, w, t = arr.shape 
    return (arr.reshape(h//nrows, nrows, -1, ncols) 
       .swapaxes(1,2) 
       .reshape(-1, nrows, ncols)) 

나는 "루프"하지만 나던 작업으로 시도 : 같은 일을 일하는 것이

for i in range(test2.shape[0]):      
    sub = blockshaped(test[i,:,:], 2, 2) 

답변

1

당신 루프 솔루션 :

sub = np.array([blockshaped(a, 2, 2) for a in test2]) 

을하지만 약간 재편, blockshaped()을 수정할 수 있습니다 슬라이스 전후의 데이터 :

def blockshaped(arr, nrows, ncols): 
    need_reshape = False 
    if arr.ndim > 2: 
     need_reshape = True 
    if need_reshape: 
     orig_shape = arr.shape 
     arr = arr.reshape(-1, arr.shape[-1]) 
    h, w = arr.shape 
    out = (arr.reshape(h//nrows, nrows, -1, ncols) 
       .swapaxes(1, 2) 
       .reshape(-1, nrows, ncols)) 
    if need_reshape: 
     new_shape = list(out.shape) 
     new_shape[0] //= orig_shape[0] 
     out = out.reshape([-1,] + new_shape) 
    return out 
+0

나는 mod ified 함수는 형태가 좋지만 모양은 거의 이상하지 않다 : (2, 4, 2, 2). 나는 기대했다 (2,2,2) 안돼? 도움을 주셔서 감사합니다;) – user3601754

+0

@ user3601754 정확히'np.array ([test2에서 a에 대해 (블록 형 (a, 2, 2)]')로 반환해야합니다.'), 그렇지 않습니까? –

+0

같은 치수! 내 코드에서 사용하려고합니다! 고마워;) – user3601754