ref
https://guebin.github.io/IP2022/2022/04/11/(6주차)-4월11일.html
https://guebin.github.io/IP2022/2022/04/18/(7주차)-4월18일.html#matplotlib
imports
넘파이 공부 3단계
- 목표: numpy의 차원에 대하여 공부해보자.
2차원 배열과 연립 1차 방정식
- 아래의 연립방정식 고려
\(\begin{cases} y+z+w = 3 \\ x+z+w = 3 \\ x+y+w = 3 \\ x+y+z = 3 \end{cases}\)
- 행렬표현?
\(\begin{bmatrix} 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} = \begin{bmatrix} 3 \\ 3 \\ 3 \\ 3 \end{bmatrix}\)
- 풀이
array([[0, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 0, 1],
[1, 1, 1, 0]])
- 다른풀이
b를 아래와 같이 만들어도 된다.
@의 유연성
- 엄밀하게는 아래의 행렬곱이 가능하다. - (2,2) @ (2,1) => (2,1) - (1,2) @ (2,2) => (1,2)
- 당연히 아래는 성립안한다.
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 2)
- 아래는 어떨까? 계산가능할까? \(\to\) 모두 계산가능! - (2,) @ (2,2) = (2,) - (2,2) @ (2,) = (2,)
- b를 마치 (2,1)처럼 해석하여 행렬곱하고 결과는 다시 (2,) 로 만든것 같다.
- 이때는 \(b\)를 마치 (1,2)처럼 해석하여 행렬곱하고 결과는 다시 (2,)로 만든것 같다.
- 아래는 어떠할까?
- (1,4) @ (4,1) = (1,1) 로 생각
- 즉 위는 아래와 같이 해석하고 행렬곱한것과 결과가 같다.
- 때로는 (4,1) @ (1,4)와 같은 계산결과를 얻고 싶을 수 있는데 이때는 차원을 명시해야함
차원
- 넘파이배열의 차원은 .shape 으로 확인가능
- 아래는 모두 미묘하게 다르다.
넘파이 공부 4단계
- 목표: 넘파이의 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, std, max, min, prod
- 모두 sum이랑 유사한 논리
(array([4., 5.]),
array([2.82842712, 2.82842712]),
array([8, 9]),
array([0, 1]),
array([ 0, 945]))
(array([0.5, 2.5, 4.5, 6.5, 8.5]),
array([0.5, 0.5, 0.5, 0.5, 0.5]),
array([1, 3, 5, 7, 9]),
array([0, 2, 4, 6, 8]),
array([ 0, 6, 20, 42, 72]))
- 참고로 std는 분포를 n으로 나눈다.
- 분모를 n-1로 나눌려면?
argmax, argmin
- 1차원
- 2차원
array([[ 0.38342049, 1.0841745 , 1.14277825, 0.30789368, 0.23778744],
[ 0.35595116, -1.66307542, -1.38277318, -1.92684484, -1.4862163 ],
[ 0.00692519, -0.03488725, -0.34357323, 0.70895648, -1.55100608],
[ 1.34565583, -0.05654272, -0.83017342, -1.46395159, -0.35459593]])
cumsum, cumprod
- 1차원
- 2차원
(array([[ 0, 1, 2, 3],
[ 4, 6, 8, 10],
[12, 15, 18, 21]]),
array([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]]))
diff
- 1차차분
- 2차차분
- prepend, append
- [1,2,4,6,7] -> [100,1,2,3,4,6] -> np.diff
(예제) a=[1,2,4,6,7]의 앞에 1을 추가하여 차분하라.
(예제) a=[1,2,4,6,7]의 뒤에 7을 추가하여 차분하라.
- 2차원 array의 차분
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]])
넘파이 공부 5단계
- 목표: maplotlib으로 간단한 과학함수들의 시각화를 배워보자.
plt.plot
- 기본그림
- 예제들
plt.hist
(array([ 23., 59., 134., 195., 233., 180., 111., 45., 14., 6.]),
array([-2.50630325, -1.93388828, -1.3614733 , -0.78905833, -0.21664336,
0.35577162, 0.92818659, 1.50060157, 2.07301654, 2.64543152,
3.21784649]),
<BarContainer object of 10 artists>)

Quiz
(숙제)
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]])
에서 axis=1 옵션으로 np.diff를 적용하여 (4,5) array를 만들고 왼쪽열에 1이 포함된 column을 추가하여 최종 결과가 아래와 같이 되도록 하라.
array([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]])







