In [55]:
np.random.seed(5)
이제 0과 20 사이에서 무작위로 15개의 정수를 3 x 5
행렬의 모양으로 생성하자.
In [56]:
a = np.random.randint(0, 20, size=(3, 5))
a
Out[56]:
a
의 항목들이 3의 배수 여부를 알려주는 어레이는 다음처럼 생성할 수 있다.
In [57]:
mask = (a % 3 == 0)
mask
Out[57]:
주의: 어레이의 연산은 항목별로 실행된다.
In [58]:
a % 3
Out[58]:
또한 두 어레이의 모양이 다르면 브로드캐스팅 기능을 이용하여 두 어레이의 모양을 가능하면 통일시킨다. 물론, 모양의 통일이 불가능하면 오류가 발생한다. 브로드캐스팅에 대해서는 다음 시간에 자세히 배운다.
아래 코드에서 a % 3
은 3 x 5
모양의 2차원 어레이 인 반면에 숫자 0은 어레이가 전혀 아니다.
하지만 숫자 0으로 이루어진 3 x 5
모양의 어레이로 모양을 만들면 두 어레이가 동일한 모양을 갖게 되고,
따라서 항목별로 비교가 가능해진다.
사실은 a % 3
도 이와 같은 방식으로 이해할 수 있다.
즉, 먼저 3으로 이루어진 3 x 5
모양의 어레이로 만든 다음에 두 어레이 간의 나머지 연산을 실행한다.
In [59]:
a % 3 == 0
Out[59]:
이제 a
의 항목들 중에서 mask
의 항목들 중 True
가 위치한 곳과 동일한 곳에 위치한 항목들만 뽑아서 1차원 어레이를 만들어 준다.
즉, a
의 항목들 중에서 3의 배수인 숫자들만 뽑아서 어레이로 만들어서 리턴한다.
In [60]:
multiple_3 = a[mask]
multiple_3
Out[60]:
다음처럼 보다 간단한 구현이 가능하다.
In [61]:
a[a % 3 == 0]
Out[61]:
In [62]:
a[a % 3 == 0] = -1
a
Out[62]:
In [63]:
a = np.arange(0, 100, 10)
a
Out[63]:
이제 다른 정수들의 어레이를 이용한다.
이때 사용되는 정수들은 인덱싱 대상으로 삼는 어레이의 인덱스 값들로 이루어져야 한다.
그렇지 않으면 IndexError
가 발생한다.
정수들의 어레이를 이용하여 인덱싱을 하면 각 항목들에 대해 인덱싱을 실행한다. 동일한 인덱스가 반복되면 인덱싱도 반복된다. 따라서 리턴값의 모양은 인덱싱으로 사용된 어레이의 모양과 동일하다.
In [64]:
b = np.array([2, 3, 2, 4, 2])
In [65]:
a[b]
Out[65]:
인덱싱을 위해 어레이 대신에 리스트를 이용해도 동일한 결과를 얻는다.
In [66]:
c = [2, 3, 2, 4, 2]
In [67]:
a[c]
Out[67]:
마스크의 경우와 마찬가지로 정수들의 어레이를 이용하여 특정 위치의 값들을 변경할 수 있다.
In [68]:
a[[9, 7]] = -100
a
Out[68]:
주의
앞서 언급하였듯이 정수들의 어레이로 인덱싱을 한 결과는 사용된 정수들의 어레이의 모양과 동일하다.
In [69]:
a = np.arange(10)
In [70]:
idx = np.array([[3, 4], [9, 7]])
idx
Out[70]:
In [71]:
a[idx]
Out[71]:
아래 그림을 보면서 팬시 인덱싱을 연습해보자.
|
In [72]:
a = np.arange(6) + np.arange(0, 51, 10)[:, np.newaxis]
a
Out[72]:
In [73]:
a[(0, 1, 2, 3, 4), (1, 2, 3, 4, 5)]
Out[73]:
In [74]:
a[3:, [0, 2, 5]]
Out[74]:
In [75]:
a[(0, 2, 5), (2, 2, 2)]
Out[75]:
(2, 2, 2)
부분을 단순히 2
라고 적어도 된다.
이유는 브로드캐스팅이 자동 적용되어 (0, 2, 5)
의 모양과 통일시켜 주기 때문이다.
In [76]:
a[(0, 2, 5), 2]
Out[76]:
하지만 마스크 인덱싱을 활용할 수도 있다.
(0, 2, 5)
에 대응하는 마스크는 다음과 같다.
In [77]:
mask = np.array([1,0, 1, 0, 0, 1], dtype =bool)
따라서 아래와 같이 실행하면 동일한 결과를 얻는다.
In [78]:
a[mask, 2]
Out[78]: