조건을 지정해 조건에 맞는 원소를 가져온다. 즉 Bool 타입의 array를 만들어 scalar와 element wise(원소 별)로 연산한다.
단,
1. shape가 동일해야 하며,
2. True 또는 False로 이루어진 Boolean array어야 한다.
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'
ndarray의 차원을 그대로 반환한다.
:
을 활용해 '연속된' index 범위의 값을 지정하는 것.indexing
과 fancy 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
...
줄임표는 이후 모든 것을 의미한다. 따라서 ...
를 중복해서 사용하면 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)은 원래라면 연산이 불가능할 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]])