일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- RDS
- 람다함수
- 함수
- 조건연산
- 행렬곱
- Jar배포
- yaml
- Postman
- 클래스
- todo project
- numpy
- 코딩테스트
- cerbot
- spring boot
- PYTHON
- Django
- 토이프로젝트
- 컴프리헨션
- 프리온보딩
- 파이써닉코드
- 파이썬
- EC2
- 백엔드 인턴십
- API
- mock server
- sqlalchemy
- 집계함수
- 프로그래머스
- Comprehension
- self
- Today
- Total
build my life
[Python] Numpy (4) axis 이해 / 배열 차원 변경 / 배열 합치기 본문
1. axis : 배열의 축
axis, 축의 개념은 배열 안에서 연산이 일어나거나 배열을 합치거나 할 때 기준이 된다.
1, 2차원의 축은 이해가 된다. 학창시절... 함수 그래프를 그릴 때 기계처럼 x축, y축을 그렸던...ㅋㅋㅋ
즉, 1차원은 축이 1개, 2차원은 2개, 3차원은 3개 점점 축이 하나씩 생기는 걸 알 수 있다.
2. 배열 차원 변경(reshape)
- reshape을 사용하면 배열의 차원을 바꿀 수 있다.
먼저, 1차원 배열인 arr가 있다고 가정해보자
arr = np.array([0,1,2,3,4,5]) #1차원배열
arr.shape # (6,)
1차원 -> 2차원
- 1차원 배열 arr를 2차원 배열인 행렬로 바꿔보자. ex) (6,) -> (2 ,3)
arr.reshape(2,3)
#[[0 1 2]
# [3 4 5]]
np.reshape(arr, [2,3])
# 이렇게 사용할 수도 있다~
=> 간단하게 reshape를 써서 차원을 변경해 1차원 배열을 2차원 배열로 변경할 수 있다.
+) 차원 추가하는 방법
1. np.newaxis 사용
arr[:,np.newaxis]
"""
[[0]
[1]
[2]
[3]
[4]
[5]]
"""
=> newaxis를 사용하여 차원을 추가할 수 있다. 이 경우 arr.shape => (6, 1)로
arr[ : , np.newaxis] == arr.reshape(-1,1)
여기서 reshape의 첫번째 인자값 -1은 모든 요소를 다 사용한다는 의미(=flatten) 이며 두번째 인자값에 숫자가 들어가면 차원을 추가한다는 의미!
❓ 만약, 두번째 인자값이 1이 아닌 2가 들어간다면?
arr.reshape(-1,2)
"""
[[0 1]
[2 3]
[4 5]]
"""
=> (3, 2)인 행렬이 반환된다!
즉, reshape의 첫번째 인자값이 -1이라는 말은 모든 요소를 flatten 시키고, 두번째 인자값에 값이 들어가면 차원을 추가하겠다! 그리고 들어간 값 만큼 요소를 묶어 추가한 차원 안에 넣겠다!
+) 3차원으로 배열의 차원을 변경해주려면 세번째 인자값을 추가하면 된다^_^
2. np.expand_dims 사용
arr = np.array([0,1,2,3,4,5])
np.expand_dims(arr, axis=0)
# [[0,1,2,3,4,5]]
# (1, 6)
np.expand_dims(arr, axis=1)
# [[0],[1],[2],[3],[4],[5]]
# (6, 1)
=> axis에 따라 shape이 달라진다. arr가 1차원배열이니 axis = 0 이면 행방향으로 차원이 추가된다.
axis = 1 이면 열방향으로 차원이 추가된다.
2차원 -> 3차원
arr = np.array([
[1,2,3],
[4,5,6],
[7,8,9]
])
# (3, 3)
arr3 = arr.reshape(-1, 1, 3)
# (3, 1, 3)
"""
[[[1 2 3]]
[[4 5 6]]
[[7 8 9]]]
"""
=> reshape 첫 번째 인자값 -1은 기존 2차원 배열인 arr를 1차원 배열로 만들어 준다는 의미
그 뒤에 2, 3번째 인자값은 1차원 배열 안 요소를 1행 3열인 2차원 배열로 만들어 추가해준다는 의미!
이렇게 reshape를 이용해서 차원을 변경 또는 추가할 수 있다!
전치(transpose)
- 행과 열을 바꾼다.
arr = np.array([
[ 1 , 2 ],
[ 3 , 4 ],
[ 5 , 6 ]
])
np.transpose(arr) / arr.T / arr.transpose()
"""
[[ 1 , 3 , 5 ],
[ 2 , 4 , 6 ]]
"""
3차원 데이터도 전치가 가능할까?! 물론 가능하다!
arr = np.array([
[
[1,2,3],
[4,5,6],
[7,8,9]
],
[
[10,11,12],
[13,14,15],
[16,17,18]
]
])
# 인자값이 없을 경우
arr.transpose()
"""
[[[ 1 10]
[ 4 13]
[ 7 16]]
[[ 2 11]
[ 5 14]
[ 8 17]]
[[ 3 12]
[ 6 15]
[ 9 18]]]
"""
# 인자값이 주어질 경우
arr.transpose(0,2,1)
"""
[[[ 1 4 7]
[ 2 5 8]
[ 3 6 9]]
[[10 13 16]
[11 14 17]
[12 15 18]]]
"""
=> 인자값으로는 axis의 번호가 들어간다. (0, 2, 1)은 axis = 1 이랑 axis = 2랑 바꾼다는 것이다.
인자값이 아무것도 주어지지 않는 경우는 (2,1,0) 인 것이다. 즉, 모든 축이 다 바뀐다.
flatten 함수
- 다차원 배열을 1차원 배열로 만든다.
arr.flatten()
==> arr.resahpe(-1)
squeeze 함수
- axis = 1인 차원 제거
> 이거 정말 이해 안된다아ㅏㅏㅏㅏㅏㅏㅏㅏ 다 시 공 부 해
3. 배열 병합
1) concatenate 함수
- axis 방향으로 배열 병합
arr1 = np.array([
[1,2],
[3,4],
[5,6]
])
arr2 = np.array([
[10,20]
])
arr3 = np.array([
[10],
[20],
[30]
])
np.concatenate((arr1,arr2))
# [[ 1, 2],
# [ 3, 4],
# [ 5, 6],
# [10, 20]]
np.concatenate((arr1,arr3), axis=1)
# [[ 1, 2, 10],
# [ 3, 4, 20],
# [ 5, 6, 30]]
=> axis 를 지정해주지 않으면 아래 방향으로 병합하고 axis를 지정해주면 지정해준 축을 기준으로 병합한다.
=> axis 축을 기준으로 병합할 경우 요소의 개수가 일치해야한다.
2) stack 함수
- 합치려는 차원의 크기가 모두 동일해야함
- 합치려는 배열을 하나의 행으로 취급
arr1 = np.array([
[1,2,5],
[3,4,6],
[5,6,9]
])
arr2 = np.array([
[10,20,30],
[5,2,3],
[60,70,80]
])
np.stack((arr1, arr2))
#[[[ 1, 2, 5],
# [ 3, 4, 6],
# [ 5, 6, 9]],
# [[10, 20, 30],
# [ 5, 2, 3],
# [60, 70, 80]]]
=> 각 배열이 하나의 행으로 취급해 합친다.
'Python' 카테고리의 다른 글
[Python] Numpy (3) Random 함수 (0) | 2022.08.30 |
---|---|
[Python] Numpy (2) 집계함수/조건연산 (0) | 2022.08.30 |
[Python] Numpy (1) (0) | 2022.08.29 |
[Python] DB 연결 / 테이블 생성 / 데이터 추가 (SQLAlchemy 사용) (4) | 2022.08.24 |
[Python] DB 연결 / 테이블 생성 / 데이터 추가 (pymysql 사용) (0) | 2022.08.23 |