[넘파이(Numpy)]N차원 배열의 인덱싱 - 배열의 Index 접근, Fancy Indexing, Boolean Indexing

Jihwan Jung·2022년 7월 17일
1

🎲넘파이

목록 보기
4/11
post-thumbnail

💡오늘 배울 내용


생성한 배열의 원소들에 접근하는 다양한 방법을 알아봅시다. 단순히 원소에 접근하는 방법부터, Fancy Indexing과 Boolean Indexing을 포함합니다.
Indexing 인덱싱
Fancy Indexing 팬시 인덱싱
Boolean Indexing 불 인덱싱

🔎배열의 Index 접근


배열의 Index에 접근한다는 것은 몇번째 원소의 값이 무엇인지, 특정 위치에 무엇이 있는지 탐색하는 것입니다.

🔔1차원 배열


arr = np.arange(10)
print(arr)
>> [0 1 2 3 4 5 6 7 8 9]

print(arr[3])
>> 3

print(arr[-1]) # -1번째 == 뒤에서 첫번째
>> 9

print(arr[-10]) # -10번째 == 뒤에서 열번째 == 앞에서 첫번째
>> 0

print(arr[3:8]) # 3~7번째까지 인덱싱
>> [3 4 5 6 7]

print(arr[3:]) # 3~끝까지 인덱싱
>> [3 4 5 6 7 8 9]

print(arr[:7]) # 처음부터 6까지 인덱싱
>> [0 1 2 3 4 5 6]

print(arr[:-1]) # 뒤에서 -1번째 == 9, 처음부터 8까지 인덱싱
>> [0 1 2 3 4 5 6 7 8]

1차원 배열에서 특정 위치의 값 하나를 인덱싱 할 수 있습니다. 또한 범위를 잡아 해당 범위를 기준으로 해도 됩니다. 중요한 부분은 첫번째 원소를 0으로 시작하여 개수를 센다는 것입니다. 맨 끝의 원소는 -1번째로 셀 수 있습니다.

🔔2차원 배열


arr = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8]])
print(arr)
>> [[1 2 3 4]
    [5 6 7 8]]

print(arr[0][3])
>> 4

print(arr[0, :]) #0번째 행에서 모든 열에 해당하는 값
>> [1 2 3 4]

print(arr[:, 1])
>> [2 6]

print(arr[:3, :]) #모든 행에서 모들 열에 해당하는 값
>> [[1 2 3 4]
    [5 6 7 8]]

print(arr[:2, 2:])
>> [[3 4]
    [7 8]]

[행][열]을 기준으로 하여 2차원 배열에서 값을 가져올 수 있습니다. 한번에 값들을 가져오는 것이 어렵다면 '행을 기준으로 하여 인덱싱', '열을 기준으로 하여 인덱싱' 이렇게 두번에 걸쳐 생각해보면 됩니다. 또한 범위를 잡아 인덱싱을 할 수 있습니다. array[행, 열]안에 기준이 될 범위를 적어주면 됩니다.

🔎팬시 인덱싱(Fancy Indexing)


한번에 여러 요소에 접근하기 위해 팬시 인덱싱을 사용할 수 있습니다. 1차원과 2차원 배열에서의 팬시 인덱싱 예제를 통해 익혀봅시다.

🔔1차원 배열


arr = np.array([5, 10, 15, 20, 25, 30])
index = [0, 2, 4]
print(arr[index]) #0, 2, 4번째 원소들을 한번에 접근하여 출력
>> [ 5 15 25]

팬시 인덱싱은 특정 인덱스 위치를 지정하는 형태의 리스트를 인덱싱 조건으로 적용하는 것입니다. 기존의 인덱싱 방법에서 대괄호 한 쌍이 더 필요하므로 형태를 잘 알아두어야 합니다.

🔔2차원 배열


arr2 = np.random.randint(1, 10, (3, 4))
print(arr2) #3행 4열의 2차원배열
>> [[4 7 7 1]
    [9 5 8 1]
    [1 8 2 6]]

print(arr2[[0, 2], 2:]) #[0행, 2행]이고 2열 이상인 원소들
>> [[7 1]
    [2 6]]

print(arr2[1:, [2, 3]]) #1행~, [2열, 3열] 원소들
>> [[8 1]
    [2 6]]

2차원 배열에서도 팬시 인덱싱을 활용할 수 있습니다. 행과 열 조건을 대괄호 안에 넣어주어야 하고, n:의 의미는 n번째부터 마지막까지라는 의미이고, [a, b]는 특정 행이나 특정 열을 콕 찝어 나타내는 것입니다.

🔎불리안 인덱싱(Boolean Indexing)


True일때는 값을 반환하고 False일때는 값을 반환하지 않는 것을 이용하여 인덱싱을 할 수 있습니다. 불리안 인덱싱은 팬시 인덱싱에 속한다고도 볼 수 있는데, Boolean 타입의 변수들로 이루어진 리스트로 인덱싱을 하는 것입니다.

🔔Boolean 값 이용


arr = np.array([1, 2, 3, 4])
print(arr[[True, False, True, False]])
>> [1 3]

arr2 = np.array([[1, 2, 3, 4],
                 [5, 6, 7, 8]])
print(arr2[[True, False], True])
>> [[1 2 3 4]]

위의 팬시 인덱싱과 마찬가지로 2차원 배열에서 인덱싱을 할 때는, 행과 열 조건을 입력해주어야 합니다. '[True, False], True'는 0행의 모든 열을 인덱싱 하겠다는 의미입니다.

🔔조건 연산자 이용


arr3 = np.array([[8, 7, 6, 5],
                 [4, 3, 2, 1]])
 print(arr3 > 3)
 >> [[ True  True  True  True]
     [ True False False False]]

배열에 조건 연산자를 이용하면, Boolean 타입으로 된 같은 규격의 배열을 얻을 수 있습니다. 이러한 배열을 이용해 Fancy Indexing을 할 수 있음으로 조건연산자를 Boolean Indexing에 활용할 수 있는 것입니다.

print(arr3[arr3 > 3])
>> [8 7 6 5 4]
profile
22.10月~24.07月 공군 암호병 복무중/ 사회 과학과 딥 러닝에 관심이 있는 학부생(CS&E)입니다. 기술과 사회에 대한 이해를 바탕으로, 비즈니스 감각과 기술적 역량을 함께 갖춘 인공지능 프로그래머•데이터 과학자로 성장하고 싶습니다.

0개의 댓글