파이썬 다층 list 데이터 처리 질문 드립니다.

조회수 734회

(900,2496,2) 크기의 3차원 list의 axis=1인 2496 데이터를 16개의 window 사이즈로 평균을 내서 하나의 값으로 반환하는 과정을 총 156회 반복하여, (900, 156, 2) 크기의 list로 만들고 싶은데, 어떻게 해야 할까요?

일단 for문으로 slicing 해서 연산을 하고 나서 (900, 1, 2)짜리의 list는 얻었는데, 이 list들을 156번 반복해서 (900, 156, 2) 짜리로 만들어야되는데, 그 방법이 궁금합니다.

다차원 list에서 특정 축에만 list 추가를 어떻게 해야하는지 몰라서 일단 (900, 1, 2)짜리를 1차원 list (1800, 1)로 펴서, 순서가 섞인 데이터를 홀짝으로 indexing해서 (900, 1)짜리 2개로 분리해서 stack으로 (900, 2)로 만들고 차원을 증가시켜서 (900, 2, 2)로 만들고 있는데, 너무 어려워서 질문 드립니다.

질문이 길었는데, 결론은 (900, 2496, 2)크기의 list의 axis=1부분만 window size 16으로 연산해서 (900, 156,2)짜리의 list로 만들고 싶습니다. 필요한 함수를 알려주시면 감사하겠습니다.

1 답변

  • 차원이 너무 크니까 (2, 10, 3) 짜리 어레이를 axis=1 에서 두개씩 나누어서 평균을 내서 (2, 5, 3) 짜리 어레이로 만드는 걸 해 봅시다.

    이런 다차원 배열을 다루는 것은 보통 numpy 를 이니까, numpy 기준으로 해 봅니다.

    >>> import numpy as np
    >>> from pprint import pprint
    >>> a = np.arange(60).reshape(2, 10, 3)
    >>> a
    array([[[ 0,  1,  2],
            [ 3,  4,  5],
            [ 6,  7,  8],
            [ 9, 10, 11],
            [12, 13, 14],
            [15, 16, 17],
            [18, 19, 20],
            [21, 22, 23],
            [24, 25, 26],
            [27, 28, 29]],
    
           [[30, 31, 32],
            [33, 34, 35],
            [36, 37, 38],
            [39, 40, 41],
            [42, 43, 44],
            [45, 46, 47],
            [48, 49, 50],
            [51, 52, 53],
            [54, 55, 56],
            [57, 58, 59]]])
    >>> a.shape
    (2, 10, 3)
    >>> np.array_split(a, 5, axis=1)
    [array([[[ 0,  1,  2],
            [ 3,  4,  5]],
    
           [[30, 31, 32],
            [33, 34, 35]]]),
     array([[[ 6,  7,  8],
            [ 9, 10, 11]],
    
           [[36, 37, 38],
            [39, 40, 41]]]),
     array([[[12, 13, 14],
            [15, 16, 17]],
    
           [[42, 43, 44],
            [45, 46, 47]]]),
     array([[[18, 19, 20],
            [21, 22, 23]],
    
           [[48, 49, 50],
            [51, 52, 53]]]),
     array([[[24, 25, 26],
            [27, 28, 29]],
    
           [[54, 55, 56],
            [57, 58, 59]]])]
    
    >>> for sub in np.array_split(a, 5, axis=1):
        pprint(sub)
    
    
    array([[[ 0,  1,  2],
            [ 3,  4,  5]],
    
           [[30, 31, 32],
            [33, 34, 35]]])
    array([[[ 6,  7,  8],
            [ 9, 10, 11]],
    
           [[36, 37, 38],
            [39, 40, 41]]])
    array([[[12, 13, 14],
            [15, 16, 17]],
    
           [[42, 43, 44],
            [45, 46, 47]]])
    array([[[18, 19, 20],
            [21, 22, 23]],
    
           [[48, 49, 50],
            [51, 52, 53]]])
    array([[[24, 25, 26],
            [27, 28, 29]],
    
           [[54, 55, 56],
            [57, 58, 59]]])
    
    >>> for sub in np.array_split(a, 5, axis=1):
        pprint(sub.mean(axis=1))
    
    
    array([[ 1.5,  2.5,  3.5],
           [31.5, 32.5, 33.5]])
    array([[ 7.5,  8.5,  9.5],
           [37.5, 38.5, 39.5]])
    array([[13.5, 14.5, 15.5],
           [43.5, 44.5, 45.5]])
    array([[19.5, 20.5, 21.5],
           [49.5, 50.5, 51.5]])
    array([[25.5, 26.5, 27.5],
           [55.5, 56.5, 57.5]])
    
    >>> result = np.stack([ sub.mean(axis=1) for sub in np.array_split(a, 5, axis=1) ], axis=1)
    >>> result
    array([[[ 1.5,  2.5,  3.5],
            [ 7.5,  8.5,  9.5],
            [13.5, 14.5, 15.5],
            [19.5, 20.5, 21.5],
            [25.5, 26.5, 27.5]],
    
           [[31.5, 32.5, 33.5],
            [37.5, 38.5, 39.5],
            [43.5, 44.5, 45.5],
            [49.5, 50.5, 51.5],
            [55.5, 56.5, 57.5]]])
    >>> result.shape
    (2, 5, 3)
    
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)