배열 인덱싱(Indexing)
- index
- 원소의 배열 내 식별 번호
- 0부터 시작
- indexing
- index를 이용해 원소 조회
- 구문
ndarray[index]
양수는 index값으로, 음수는 뒤부터 조회 (
[-1] == 마지막 index
)- N차원 배열
arr[0축 index, 1축 index, 2축 index ... n축 index]
- 파이썬 리스트와 차이점
- 리스트의 경우
py_list[0축 index][1축 index][2축 index]...[n축 index]
- fancy indexing(팬시 인덱싱)
- 여러개의 원소를 한번에 조회할 경우 리스트에 담아 전달
- 다차원 배열의 경우 각 축별로 list로 지정
arr[[1,2,3,4,5]]
- 1차원 배열(vector): 1,2,3,4,5 번 index의 원소들 한번에 조회
arr[[0,3], [1,4]]
- [0,3] - 0번축 index list, [1,4] - 1번축 index list 2차원 배열(matrix): [0,1], [3,4] 의 원소들 조회
- 코드 예시
1 2
a = np.arange(30).reshape(5, 6) print(a[[0, 3], [1, 4]])
1
[ 1 22]
- 좌표 형식이라고 생각하면 편함
- 2차원의 경우 앞 리스트는 가로, 뒤 리스트는 세로에서의 값의 위
- 위 코드의 경우는
a[0, 1]
과a[3, 4]
를 한번에 조회하는 방식이다.
- 좌표 형식이라고 생각하면 편함
Slicing (슬라이싱)
- 배열의 원소들을 범위로 조회한다.
ndarry[start : stop : step ]
- 각 축에 slicing 문법 적용
- 2차원의 경우
arr [0축 slicing, 1축 slicing]
arr[:3, :]
,
로 축을 구분한 다중 슬라이싱 사용
- 다차원의 경우
arr[0축 slicing, 1축 slicing, ..., n축 slicing]
- slicing과 indexing 문법은 같이 쓸 수 있다.
슬라이싱은 원본에 대한 View
- slicing한 결과는 새로운 배열을 생성하는 것이 아니라 기존 배열을 참조한다.
- slicing한 배열의 원소를 변경하면 원본 배열의 것도 바뀐다.
배열.copy()
- 배열을 복사한 새로운 배열 생성
- 복사후 처리하면 원본이 바뀌지 않는다.
boolean indexing
- Index 연산자에 같은 형태(shape)의 Boolean 배열을 넣으면 True인 index의 값만 조회 (False가 있는 index는 조회하지 않는다.)
- ndarray내의 원소 중에서 원하는 조건의 값들만 조회할 때 사용
- ndarray는 element-wise 연산을 지원한다. 이를 이용해 boolean indexing으로 원하는 조건의 값들을 조회할 수 있다.
- boolean indexing을 masking이라고도 한다.
- 2차원 이상인 경우에도 가능하다
넘파이 비교 연산자
- 파이썬의 and, or, not은 사용할 수 없다.
&
: and연산|
: or 연산~
: not 연산- 피연산자는
( )
로 묶어야 한다. - Boolean indexing의 경우에는 들어간 array 의 형태와 똑같이 나오지만 비교 연산을 하고 난 이후에는 shape를 유지를 못하기 때문에 1차원 형식으로 돌려준다.