인덱싱과 슬라이싱은 NumPY에서 데이터를 다루는 중요한 부분 중에 하나이다.
Python의 List와 유사하게 NumPY ndarray도 슬라이싱을 할 수 있는데 다차원인 경우가 많기 때문에 각 차원별로 어떻게 슬라이스할건지 명확히 해야한다. NumPY ndarray를 슬라이싱하면 결과로 얻어지는 배열은 언제나 원본 배열의 부분 배열이다.
- NumPY slicing?
연속된 객체 범위를 지정 선택해서 객체들을 가져오는 방법으로 슬라이싱을 하면 새로운 객체를 생성하게 된다. 원본 배열의 일부분을 복사해서 가져오지만 새로운 배열이 아니라 레퍼런스이다.
기본형태 : array_name[start:end:step]
각각 start, end, step은 양수와 음수를 가질 수 있다.
start: 슬라이싱을 시작할 위치로 start를 기술하지 않으면 0을 나타낸다.
end: 슬라이싱을 끝낼 위치로 end를 포함하지 않는다. 즉 end-1을 나타낸다. end를 기술하지 않으면 끝을 나타낸다.
step: stride라고도 하며 몇개씩 끊어서 가져올지를 정한다. 옵션으로 삭제할 수도 있다.
start:end:step은 ','를 이용해서 슬라이싱할 수 있다.
array_name[행 슬라이싱 시작:행 슬라이싱 끝, 열 슬라이싱 시작:열 슬라이싱 끝]
ndarray에서 인덱스 값들의 위치
양수: 연속적인 객체들의 제일 앞에서부터 0을 시작으로 함
음수: 연속적인 객체들의 제일 뒤에서부터 -1을 시작으로 함
ex_array[a,b,c,d,e]
양수의 경우 a, b, c, d, e는 순서대로 0, 1, 2, 3, 4 양수의 인덱스 값을 같고
음수의 경우 a, b, c, d, e는 순서대로 -5, -4, -3 ,-2, -1 음수의 인덱스 값을 같는다
- NumPY 인덱싱
슬라이싱이 자르는 것이라면 인덱싱은 선택을 해서 가져오는 것이다. 인덱싱을 통해서 원소에 접근할 수 있다.
인덱싱은 아래 두 가지 방법으로 접근할 수 있다.
- a[0,0] //python에서 선호하는 방법, python에서는 이 방법을 사용하자.
- a[0][0] //C++ style
ndarray를 인덱싱하면 연속하지 않은 값을 가져올 수 있기 때문에 원본과 다른 배열을 만들 수 있다.
- 인덱싱과 슬라이싱의 차원
인덱싱과 슬라이싱을 혼합해서 사용하면 낮은 차원의 배열이 생성된다.
슬라이싱은 원본의 데이타를 그대로 가져오는 레퍼러스이기 때문에 원본과 동일한 차원의 배열이 생성된다.
인덱싱은 원본에서 새로운 배열을 가져오는 것이기 때문에 원본보다 낮은 차원의 배열이 생성될 수 있다.
인덱싱을 하면은 해당 인덱싱 값만 가져오기 때문이다. 다차원 배열의 연산을 할 때는 차원이 같아야 한다.
다차원 배열에서는 차원이 달라 연산 시 문제가 될 때가 있다. 특별히 인덱싱을 써야하는 상황이 아니라면 슬라이싱으 추천한다.
- 불리언 배열 인덱싱
불리언 배열 인덱싱을 통해 배열 속 요소를 취사선택할 수 있다. 불리언 배열 인덱싱은 특정 조건을 만족하게 하는 요소만 선택하고자 할 때 자주 사용된다.
불리언 인덱싱은 다차원 배열에서 데이터를 필터링 할 때 많이 쓴다. 특정 조건을 만족하는 요소를 선택하고자 할 때 사용한다.
- 정수 배열 인덱싱
- 전치(transpose)
전치는 모양(stride)을 바꾸는 기능을 한다. 종종 배열의 모양을 바꾸어 데이터를 처리할 때가 있다. 가장 간단한 예는 행렬의 주 대각선을 기준으로 대칭되는 요소끼리 뒤바뀌는 것이다.
행렬을 전치하기 위해서는 간단하게 배열 객체의 'T' 속성을 사용하면 된다. 1차원일 경우 대각선이 없기 때문에 전치를 해도 아무런 변화가 없다.
데이터 분석할 때 많이 사용하지는 않지만 머신러닝의 알고리즘을 구현할 때는 많이 사용한다.
- Shape변경
shape 변경에는 크게 세가지 메서드를 볼 것이다.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html?highlight=reshape
resahape 메서드는 다차원 배열 데이타의 값 변화 없이 shape의 형태만 바꾸는 메서드이다.
ravel을 다차원 배열을 직선, 1차원으로 만들어 주는 것이다. ravel은 몰라도 resahpe를 할 줄 알면 된다. 편한 점은 사이즈를 명시하지 않아도 된다는 것이다.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html?highlight=ravel
주로 NN학습을 할 때 사용한다. 3차워을 NN에 바로 넣어주지 않고 1차원으로 만들어서 넣어준다.
flatten은 NumPY의 모듈 함수가 아니기 때문에 np.flatten으로 사용할 수 없다. ndarray 객체의 메서드로만 사용할 수있다. reval과 동일한 결과를 나타낸다.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html?highlight=flatten
- ravel()과 flatten()의 차이점
flatten은 객체의 메서드로만 사용가능
ravel은 뷰(참조)를 반환, flatten은 복사본을 반환
- 연결(numpy.concatenate)
https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html?highlight=concatenate
다차원 배열 연산
기본적인 수학함수는 배열의 각 요소별로 동작하며 연산자를 통해 동작하거나 numpy함수 모듈을 통해 동작한다.
다차원 배열간 연산 시 shape가 맞아야 연산이 이루어진다.
- 요소별 합, 차, 곱, 나눗셈의 경우 shape가 일치해야 함
- dot의 경우 앞 배열의 열과 뒤 배열의 행의 크기가 일치해야 함
NumPY에서는 벡터의 내적, 베터와 행렬의 곱, 행렬곱을 위해 *대신 dot 함수들을 사용한다. dot은 NumPY 모듈 함수또는 배열 객체의 메소드로서도 이용 가능한 함수이다.
'karma( 업 ) > Python' 카테고리의 다른 글
Python은 왜 main함수가 없을까? (0) | 2019.06.18 |
---|---|
5. 브로드 캐스팅, 벡터화 연산 NumPY 고급기능 (0) | 2019.05.06 |
3. 메서드를 이용해서 최대, 최소, 평균, 표준편차 등 통계값 구하기 (0) | 2019.05.06 |
2. 다차원 배열 생성하기 (0) | 2019.05.06 |
1. NumPY ? (1) | 2019.05.05 |