Lesson 06: numpy II
Imports
Numpy: axis의 이해
- 목표: 넘파이의 axis를 이해하여 보자.
np.concatenate
- 기본예제
- 응용
- 여기까진 딱히 칸캐터네이트의 메리트가 없어보임
- 리스트였다면 a+b+c 하면 되는 기능이니까?
- 2d array에 적용해보자.
- 옆으로 붙일려면?
- 위의 코드에서 axis=1 이 뭐지? axis=0,2 등을 치면 결과가 어떻게 될까?
- 이건 그냥 np.concatenate([a,b])와 같다.
- np.concatenate([a,b])는 np.concatenate([a,b],axis=0)의 생략버전이군?
- 이런건 없다.
- axis의 의미가 뭔지 궁금함. 좀 더 예제를 살펴보자.
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]]])
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]]])
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]],
[[ 0, -1, -2, -3],
[ -4, -5, -6, -7],
[ -8, -9, -10, -11]],
[[-12, -13, -14, -15],
[-16, -17, -18, -19],
[-20, -21, -22, -23]]])
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, -1, -2, -3],
[ -4, -5, -6, -7],
[ -8, -9, -10, -11]],
[[ 12, 13, 14, 15],
[ 16, 17, 18, 19],
[ 20, 21, 22, 23],
[-12, -13, -14, -15],
[-16, -17, -18, -19],
[-20, -21, -22, -23]]])
array([[[ 0, 1, 2, 3, 0, -1, -2, -3],
[ 4, 5, 6, 7, -4, -5, -6, -7],
[ 8, 9, 10, 11, -8, -9, -10, -11]],
[[ 12, 13, 14, 15, -12, -13, -14, -15],
[ 16, 17, 18, 19, -16, -17, -18, -19],
[ 20, 21, 22, 23, -20, -21, -22, -23]]])
- 이번에는 axis=2까지 된다?
- axis=3까지는 안된다?
- 뭔가 나름의 방식으로 합쳐지는데 원리가 뭘까?
(분석1) np.concatenate([a,b],axis=0)
- 첫번째차원이 바뀌었다 => 첫번째 축이 바뀌었다 => axis=0 (파이썬은 0부터 시작하니까!)
(분석2) np.concatenate([a,b],axis=1)
- 두번째차원이 바뀌었다 => 두번째 축이 바뀌었다 => axis=1
(분석3) np.concatenate([a,b],axis=2)
- 세번째차원이 바뀌었다 => 세번째 축이 바뀌었다 => axis=2
(분석4) np.concatenate([a,b],axis=3)
AxisError: axis 3 is out of bounds for array of dimension 3
- 네번째차원이 없다 => 네번째 축이 없다 => axis=3으로 하면 에러가 난다.
(보너스1)
array([[[ 0, 1, 2, 3, 0, -1, -2, -3],
[ 4, 5, 6, 7, -4, -5, -6, -7],
[ 8, 9, 10, 11, -8, -9, -10, -11]],
[[ 12, 13, 14, 15, -12, -13, -14, -15],
[ 16, 17, 18, 19, -16, -17, -18, -19],
[ 20, 21, 22, 23, -20, -21, -22, -23]]])
- 마지막 차원이 바뀌었다 => 마지막 축이 바뀌었다 => axis = -1
(보너스2)
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, -1, -2, -3],
[ -4, -5, -6, -7],
[ -8, -9, -10, -11]],
[[ 12, 13, 14, 15],
[ 16, 17, 18, 19],
[ 20, 21, 22, 23],
[-12, -13, -14, -15],
[-16, -17, -18, -19],
[-20, -21, -22, -23]]])
- 마지막에서 2번째 차원이 바뀌었다 => 마지막에서 2번째 축이 바뀌었다 => axis = -2
(보너스3)
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]],
[[ 0, -1, -2, -3],
[ -4, -5, -6, -7],
[ -8, -9, -10, -11]],
[[-12, -13, -14, -15],
[-16, -17, -18, -19],
[-20, -21, -22, -23]]])
- 마지막에서 3번째 차원이 바뀌었다 => 마지막에서 3번째 축이 바뀌었다 => axis = -3
(보너스3)
- 마지막에서 4번째 차원은 없다 => 마지막에서 4번째 축이 없다 => axis = -4는 에러가 난다.
- 0차원은 축이 없으므로 concatenate를 쓸 수 없다.
- 꼭 a,b가 같은 차원일 필요는 없다.
np.stack
- 혹시 아래가 가능할까?
- (3,) 결합 (3,) => (3,2)
- 불가능
- 아래와 같이 하면 해결가능
- 분석: (3) (3) => (3,1) (3,1) => (3,1) concat (3,1)
- 위의 과정을 줄여서 아래와 같이 할 수 있다.
- 아래도 가능
- 분석해보고 외우자
(분석1)
- => 첫 위치에 축을 추가 (axis=0) => (1,3) (1,3) => (2,3)
(분석2)
- => 두 위치에 축을 추가 (axis=1) => (3,1) (3,1) => (3,2)
- 고차원예제
np.concatenate 는 축의 총 갯수를 유지하면서 결합, np.stack은 축의 갯수를 하나 증가시키면서 결합
sum
- 1차원
- 2차원
- 2차원 결과 분석
- 첫번째 축이 삭제됨 => axis=0
- 두번째 축이 삭제됨 => axis=1
- 연습
(문제1) 1열의 합, 2열의 합을 계산하고 싶다면?
(풀이) 차원이 (5,2) => (2,) 로 나와야 한다. (그럼 첫번째 축이 삭제되어야 하네?)
(문제2) 1행의 합, 2행의 합, … , 5행의 합을 계산하고 싶다면?
(풀이) 차원이 (5,2) => (5,)로 나와야 한다. (그럼 두번째 축이 삭제되어야 하네?)
(문제3) a의 모든원소의 합을 계산하고 싶다면?
(풀이) 차원이 (5,2) => () 로 나와야 한다. (첫번째축, 두번째축이 모두 삭제되어야 하네?)
mean, max, min
- 모두 sum이랑 유사한 논리
Quiz
1 – 6. a,b가 아래와 같이 주어졌다고 하자.
1. a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
2. a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[2],
[2],
[2],
[2],
[2],
[2],
[2],
[2],
[2],
[2]])
3. a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]
4. a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2]])
5. a,b와 np.stack을 이용하여 아래와 같은 배열을 만들어라.
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]
6. a,b와 np.stack을 이용하여 아래와 같은 배열을 만들어라.
array([[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2]])
7–8
아래와 같은 매트릭스를 생성하라.
array([[ 0.38342049, 1.0841745 , 1.14277825, ..., -0.18506968,
1.05538764, 1.18701443],
[-0.25027283, -1.58045215, 0.1124153 , ..., 1.0321894 ,
0.40438012, -0.13491595],
[-0.76763724, -0.64294232, -0.24782396, ..., -0.01530161,
0.89125897, -0.82683395],
...,
[-1.41379028, 0.79611333, -0.71011837, ..., -0.9860352 ,
1.30755244, 2.18677233],
[ 1.33968105, -0.78457449, -0.10405858, ..., -0.71110186,
0.99841286, 2.34371635],
[-0.66422032, -0.07550233, 0.7405869 , ..., 1.03232398,
-0.18988252, -0.03578389]])
7. 각 행의 합을 구하라. 즉 1행의 합, 2행의 합, … 100행의 합을 계산하라.
- 1행의합 = 0.38342049 + 1.0841745 + … + 1.18701443
8. 각 열의 평균을 구하라. 즉 1열의 평균, 2열의 평균, … , 100열의 평균을 계산하라.