[NumPy] Indexing

kkiyou·2021년 6월 11일
0

Data Science

목록 보기
5/11

1. Boolean indexing

조건을 지정해 조건에 맞는 원소를 가져온다. 즉 Bool 타입의 array를 만들어 scalar와 element wise(원소 별)로 연산한다.
단,
1. shape가 동일해야 하며,
2. True 또는 False로 이루어진 Boolean array어야 한다.

  • scalar: 방향성은 없으나, 실수 공간에서 크기를 나타내는 것을 의미한다. python에서는 int, float, bool, None을 의미한다.
>>> arr = np.arange(24).reshape(3, 2, 4)
>>> arr
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]]])

>>> bool_arr = (arr % 2 == 1)
>>> bool_arr
array([[[False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True]]])

>>> bool_arr.dtype
dtype('bool')

>>> arr[bool_arr]
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23])

# arr[bool_arr]과 같다.
>>> arr[np.array([[[False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True]]])]
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23])

이러한 문법은 list에서는 사용할 수 없다.

>>> lis = list(range(5))
>>> lis % 2 == 1
TypeError: unsupported operand type(s) for %: 'list' and 'int'


2. fancy indexing

ndarray의 차원을 그대로 반환한다.

  • indexing: index(위치) 값을 지정하는 것.
  • fancy indexing: ndarray를 그대로 유지한 채 연속되지 않은 특정 index 값의 집합을 지정하는 것.
  • slicing: :을 활용해 '연속된' index 범위의 값을 지정하는 것.

indexingfancy indexing 그리고 slicing을 비교하면 다음과 같다.

>>> arr = np.arange(24).reshape(3, 2, 4)
>>> arr
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]]])

# indexing
>>> arr[0].shape
(2, 4)

# fancy indexing
>>> arr[[0]].shape
(1, 2, 4)
>>> arr[[0], [1], [0, 3]]
array([4, 7])

# slicing
>>> arr[:, 0, :2]
array([[ 0,  1],
       [ 8,  9],
       [16, 17]])
>>> arr[:, 0, :2].shape
(3, 2)

# fancy indexing은 slicing할 수 없다.
>>> arr[[:], [0], [:2]]
SyntaxError: invalid syntax

Advanced Indexing

참고자료 1



3. Ellipsis

... 줄임표는 이후 모든 것을 의미한다. 따라서 ...를 중복해서 사용하면 Error가 발생한다.

>>> arr = np.arange(24).reshape(3, 2, 4)
>>> arr
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]]])

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

>>> arr[0, ..., 2]
array([2, 6])

>>> arr[0, ..., ...]
IndexError: an index can only have a single ellipsis ('...')

>>> type(...)
ellipsis


broadcasting

브로드캐스팅(Broadcasting)은 원래라면 연산이 불가능할 shape가 다른 배열 사이에서 특정 조건을 만족했을 때 연산이 가능해지도록 배열이 자동적으로 변하는 것을 의미한다.

>>> arr = np.arange(6).reshape(2, 3)
>>> arr
array([[0, 1, 2],
       [3, 4, 5]])

>>> arr + 1
array([[1, 2, 3],
       [4, 5, 6]])

>>> arr + [10, 10, 10]
array([[10, 11, 12],
       [13, 14, 15]])

0개의 댓글