앎을 경계하기

Programming/Python

파이썬 '...' ellipsis 의미

양갱맨 2020. 10. 26. 13:52

주로 파이썬에서 배열 인덱싱을 위해 콜론(:)을 사용한다.

>>> x = [1,2,3,4,5]
>>> x = [:-1]
[1,2,3,4]

numpy에서도 마찬가지이다.

>>> x = np.array(range(10)).reshape(2,5)
array([[0,1,2,3,4],
       [5,6,7,8,9]])
>>> x[:]
array([[0,1,2,3,4],
       [5,6,7,8,9]])
>>> x[:,:]
array([[0,1,2,3,4],
       [5,6,7,8,9]])

ellipsis를 사용하면 : 사용한 것 처럼 결과가 나온다.

>>> x[...]
array([[0,1,2,3,4],
       [5,6,7,8,9]])

3차원 이상의 배열에서 사용해보자.

>>> x = np.array(range(27)).reshape(3,3,3)
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]]])
>>> x[...]
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]]])
>>> x[:]
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]]])

일단은 :, ... 모두 같은 결과가 나온다. 한 번 배열내 부분 원소만 출력해보자.

>>> x[1,...]
array([[ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])
>>> x[1,:]
array([[ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])

 

똑같다.

그럼 뭐가 다른거지?

>>> x[:,:,1]
array([[ 1,  4,  7],
       [10, 13, 16],
       [19, 22, 25]])
>>> x[...,...,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: an index can only have a single ellipsis ('...')
>>> 

...은 한번만 사용할 수 있고 :는 여러번 사용 가능하다.

인덱스 슬라이싱 외에 ellipsis가 사용되는 곳이 여러군데 있는 것 같다.
pass 대신으로도 사용 가능한 것 같고.. 뭐 그 외에는 필요하면 찾아보는 것이 좋겠다.