[Numpy] 배열 분할하기(np.split)

반응형
    반응형

    numpy 에서 배열 분할하는 방법에 대해서 알아보겠습니다.

     

    기본적으로 np.split(array, indices or section, axis=0) 으로 분할합니다. 

    행렬이 3차원이상이면 수직(vertical), 수평(horizontal), 깊이(depth)로 구성되어 있는데

    np.split에서는 수직(행),수평(열)만 가능하기에 깊이로 분할이 불가능합니다.

    그렇기 때문에 각각에 대해 다른 대체 메쏘드가 존재합니다. 

    axis=0 일때는 np.vsplit() 으로 axis=1 일때는 np.hsplit()으로 axis=2 일때는 np.dsplit() 으로 가능합니다.

     

    또한, np.split는 같은 크기로의 분할만 가능합니다. 

    예를 들어, (4,4) 행렬이라면 같은 크기로 나눌 수 있는 1,2,4에서만 가능합니다. 

    이를 무시하고 싶다면 즉, 3으로 나누고 싶다면 np.array_split() 메쏘드로 할 수 있습니다. 

    하지만 없는 걸 생성할 수는 없습니다. (4,4) 행렬을 3으로 나누면 3,1 로 나눠지게 되어서 크기가 다르게 데이터가 나올 수 있기 때문에 필요없는 데이터가 있을 경우 사용합니다.

     


    [배열 분할하기]


    행(row)으로 분할하기(np.vsplit(), np.split(axis=0))

    수직(행)으로 분할하는 방법입니다. 

    np.split이나 np.vsplit으로 할 수 있습니다. 

    np.vsplit(array, indices or section) 으로 되어있고 axis의 정보를 넣지 않아도 됩니다.

     

    행은 axis=0 이고 같은 크기로 분할해야하기 때문에

    행렬 (m,n) 이 있다면 m에 의해서 숫자가 결정됩니다.

    즉, m의 약수만으로 분할할 수 있습니다.

     

    다음과 같은 배열을 행으로 분할하려고 한다면 6의 약수인 1,2,3,6 으로만 가능합니다. 

    참고로, 1로 하면 c 그대로 나오기 때문에 의미가 없습니다.

    c = np.arange(18).reshape(6,3)
    c

    np.split(c,2,axis=0)  # np.vsplit(c,2)

     

    수직선을 여러개 넣는 방식도 있습니다. 

    리스트로써 값을 넣어주면 가능합니다. 

    예를 들어 [1,4] 를 한다면 1번째 자리와 4번째 자리에 수직선을 넣어 분할합니다.

    따라서 1, 234, 56으로 분할됩니다.

    np.split(c,[1,4],axis=0) # np.vsplit(c,[1,4])

     

    열(column)으로 분할하기(np.hsplit(),np.split(axis=1))

    행으로 분할하는 원리와 동일합니다. 

    np.split으로 한다면 axis=1 로 바뀌는 것과 열에 해당하는 숫자에 따라 나눠야 하는게 다르고 np.hsplit을 써야 하는게 다릅니다.

     

    행에서 했던 예로 그대로 쓰면 1,3으로만 나눌 수 있습니다.

     

    np.split(c,3,axis=1) # np.hsplit(c,3)

     

    행 분할과 마찬가지로 여러 수평선으로 나눌 수 있습니다.

    np.split(c,[2],axis=1)

     

    깊이(axis=2)로 분할하기(np.dsplit())

    깊이로 하는 방법입니다. 차원은 3차원이상이어야 가능하고 np.split으로 할 수가 없습니다. 

    그래서 np.dsplit을 이용합니다.

    b = np.arange(16).reshape(2,2,4)
    b

     

    b에 적용하면 axis=2 이어야 하니 4의 약수인 1,2,4 만 가능합니다.

    np.dsplit(b,2)

     

    선을 넣어서 분할하고 싶다면 리스트를 넣어 적용합니다.

    np.dsplit(b,[1,3])

    다른 크기로 배열 분할(np.array_split())

    np.split는 같은 크기로만 분할이 가능했습니다. 다른 크기로 분할하고 싶다면 np.array_split()를 씁니다. 하지만 우선적으로 원하는 크기로 분할해 데이터를 확보하는 정도라서 깔끔하게 크기를 맞추고 나머지는 버릴 때 사용합니다.

     

    np.array_split(array, indices or section, axis=0) 으로 구성되어 있습니다.

    np.split와 비슷하고 indices의 제약이 없는 것 뿐입니다.

    위에서 보인 c는 (6,3)의 행렬로 행으로 4로 나눌 수가 없습니다. 

    하지만 np.array_split()을 사용하면 가능합니다.

     

    c = np.arange(18).reshape(6,3)
    c

     

    np.array_split(c,4,axis=0)

    보시다시피 2,2,1,1 로 나눠졌습니다. 4개로 나눠달라는 것이기 때문에 선제적으로 2,2 로 나눈 후 나머지 2개를 다시 2개로 나누는 방식으로 나눠집니다. 그래서 리턴할때 4//6+1 이나 4//6 으로 나눠집니다.

    여기서 //는 4로 6을 나눴을때 몫만 취하는 걸 얘기합니다.

    일반화하면 n개의 행을 I 개로 분할하고 싶다면 I//n+1 이나 I//n 으로 나눠집니다. 우선적으로 I//n+1 로 하고 나머지에 한해서 I//n으로 나눠집니다.

     
    관련 포스팅

     

    댓글

    Designed by JB FACTORY

    ....