import numpy as np
06wk-1: Numpy (1)
중간고사 관련
1
. 일정
- 9wk-1 : 가장 유력
- 8wk-2, 9wk-2: 가능성 있음
2
. 방식
- 방식1: 오픈북 O / 구글검색 O / ChatGPT O <– 가장 유력
- 방식2: 오픈북 O / 구글검색 O / ChatGPT X <– 2022년 중간고사 방식
- 방식3: 오픈북 X / 구글검색 X / ChatGPT X <– 2021년 중간고사 방식
3
. 난이도
- 시험방식에 따라 다름 (방식1로 칠 경우 난이도가 가장 높을 것으로 예상)
4
. 범위
- 넘파이, 판다스, matplolib <– 유력
강의영상
youtube: https://youtube.com/playlist?list=PLQqh36zP38-xvHU3Dnl1w3YEd6uLZhThJ
예비학습
-
혹시 행렬을 처음 보시는 학생이 있다면 아래주소의 영상에서 1-4를 학습하시면 됩니다. (1-5까지 있는데 1-4까지만 보시면됩니다) 혹은 스스로 학습하셔도 무방합니다.
- https://guebin.github.io/IR2021/2021/10/29/(A2)-%EB%A7%A4%ED%8A%B8%EB%A6%AD%EC%8A%A4.html
-
행렬을 알고 있다면 위의 주소의 영상은 skip 하셔도 무방합니다.
import
넘파이 공부 1단계
선언
= [1,2,3]
l = np.array(l) a
=np.array([1,2,3]) # list를 만들고 ndarray화 시킴
a=[1,2,3] l
기본연산 브로드캐스팅
-
사칙연산가능
+1 ## [1,2,3] + 1 = [2,3,4] a
array([2, 3, 4])
+1 l
TypeError: can only concatenate list (not "int") to list
*2 a
array([2, 4, 6])
*2 l
[1, 2, 3, 1, 2, 3]
/2 a
array([0.5, 1. , 1.5])
/2 l
TypeError: unsupported operand type(s) for /: 'list' and 'int'
-
제곱이 가능
**2 a
array([1, 4, 9])
**2 l
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
-
나머지 연산가능
%2 # %2 = 2로 나눈 나머지를 리턴 a=[1,2,3] a
array([1, 0, 1])
%2 l
TypeError: unsupported operand type(s) for %: 'list' and 'int'
기타수학연산지원
np.sqrt(a), np.sqrt(l)
(array([1. , 1.41421356, 1.73205081]),
array([1. , 1.41421356, 1.73205081]))
np.log(a), np.log(l)
(array([0. , 0.69314718, 1.09861229]),
array([0. , 0.69314718, 1.09861229]))
np.exp(a), np.exp(l)
(array([ 2.71828183, 7.3890561 , 20.08553692]),
array([ 2.71828183, 7.3890561 , 20.08553692]))
np.sin(a), np.sin(l)
(array([0.84147098, 0.90929743, 0.14112001]),
array([0.84147098, 0.90929743, 0.14112001]))
차원 (\(\star\))
-
넘파이배열의 차원은 .shape 으로 확인가능
-
아래는 모두 미묘하게 다르다.
=np.array(3.14) # 스칼라, 0d array
a a, a.shape
(array(3.14), ())
=np.array([3.14]) # 벡터, 1d array
a a, a.shape
(array([3.14]), (1,))
=np.array([[3.14]]) # 매트릭스, 2d array
a a, a.shape
(array([[3.14]]), (1, 1))
=np.array([[[3.14]]]) # 텐서, 3d array
a a, a.shape
(array([[[3.14]]]), (1, 1, 1))
넘파이 공부 2단계
인덱싱 1차원
-
선언
=[11,22,33,44,55,66]
l=np.array(l) a
-
인덱스로 접근
0],l[1],l[2],l[3],l[-2],l[-1] l[
(11, 22, 33, 44, 55, 66)
0],a[1],a[2],a[3],a[-2],a[-1] a[
(11, 22, 33, 44, 55, 66)
-
:
이용 (슬라이싱)
2:4] # index 2에서 시작, index 4는 포함하지 않음 l[
[33, 44]
2:4] a[
array([33, 44])
-
정수배열에 의한 인덱싱
a
array([11, 22, 33, 44, 55, 66])
0,2,4]] # index=0, index=2, index=4 에 해당하는 원소를 뽑고 싶다 a[[
array([11, 33, 55])
0,2,4]] # 리스트는 불가능 l[[
TypeError: list indices must be integers or slices, not list
-
참고: 정수배열에 의한 인덱싱에서 아래의 코드는 돌아가지 않음.
0,2,4)] # a[[0,2,4]] 는 돌아감 a[(
IndexError: too many indices for array: array is 1-dimensional, but 3 were indexed
- 즉 a[
index
]에서 index의 자리에 리스트를 넣어야만 동작. - index자리에 튜플을 넣으면 동작하지 않음.
- 이러한 사소한 지식까지 알아야 하는걸 추천하는건 아님.
-
부울값에 의한 인덱싱
a
array([11, 22, 33, 44, 55, 66])
True, False, True, False, True, False]] a[[
array([11, 33, 55])
응용하면?
< 33 a
array([ True, True, False, False, False, False])
<33] a[a
array([11, 22])
리스트는 불가능
<33 # 여기에서부터 불가능 l
TypeError: '<' not supported between instances of 'list' and 'int'
True,False,True,False,True,False]] # 이것도 불가능 l[[
TypeError: list indices must be integers or slices, not list
인덱싱 2차원
-
중첩리스트와 2차원 np.array 선언
= [[1,2,3,4],[-1,-2,-3,-4],[5,6,7,8],[-5,-6,-7,-8]]
A = np.array(A) A2
A
[[1, 2, 3, 4], [-1, -2, -3, -4], [5, 6, 7, 8], [-5, -6, -7, -8]]
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
-
A의 원소 인덱싱
np.array(A)
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
-
A(이중list)에서의 원소 추출
0][0] # (1,1)의 원소 A[
1
1][2] # (2,3)의 원소 A[
-3
-1][0] # (4,1)의 원소 A[
-5
-
A2(넘파이어레이)에서의 원소 인덱싱
0][0] # (1,1)의 원소 A2[
1
1][2] # (2,3)의 원소 A2[
-3
-1][0] # (4,1)의 원소 A2[
-5
-
A2에서만 되는 기술 (넘파이에서 제시하는 신기술, R에서는 기본적으로 쓰던것, 이중list는 불가능)
0,0] # (1,1)의 원소 A2[
1
1,2] # (2,3)의 원소 A2[
-3
-1,0] # (4,1)의 원소 A2[
-5
-
A2에서의 인덱싱예시
(예시1) 1행,1-2열 추출
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
0,0:2] # 1행1열, 1행2열 A2[
array([1, 2])
(예시2) 1행 추출
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
0,:] # 방법1 A2[
array([1, 2, 3, 4])
0] # 방법2 A2[
array([1, 2, 3, 4])
(예시3) 1행,3행 추출
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
0,2],:] # 방법1 A2[[
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
0,2]] # 방법2 A2[[
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
(예시4) 1열 추출
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
0] # 방법1, 출력이 이상하게 보이는데? A2[:,
array([ 1, -1, 5, -5])
0]] # 방법2 A2[:,[
array([[ 1],
[-1],
[ 5],
[-5]])
(예시5) 1열,3열 추출
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
0,2]] # 1열, 3열 A2[:,[
array([[ 1, 3],
[-1, -3],
[ 5, 7],
[-5, -7]])
(예시6) 1행2행, 1열3열 추출 – 삭제하려다가 다시 설명하는 내용
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
헷갈려: 문장이 좀 모호한데 경우1,2중 수행 하라는 것인지 모호하다.
(경우1) 이러한 숫자들을 뽑으라는 의미인지, (즉 1행 1,3열, 2행 1,3열을 뽑으란 의미인지)
\[\begin{bmatrix} 1 & | & 3 & | \\ -1 & | & -3 & | \\ | & | & | & | \\ | & | & | & | \end{bmatrix}\]
(경우2) 이러한 숫자들을 뽑으란 의미인지, (즉 1행1열, 2행3열을 뽑으란 의미인지)
\[\begin{bmatrix} 1 & | & | & | \\ | & | & -3 & | \\ | & | & | & | \\ | & | & | & | \end{bmatrix}\]
0:2, [0,2]] # 경우1이 구현 A2[
array([[ 1, 3],
[-1, -3]])
0,1],[0,2]] # 경우2가 구현 A2[[
array([ 1, -3])
-
인덱싱에 대한 미묘한 차이 \((\star)\)
관찰: 2차원 array의 인덱싱 결과가 2차원이 나올수도있고, 1차원이 나올수도 있다.
0], A2[0].shape A2[
(array([1, 2, 3, 4]), (4,))
- shape이 (4,)인 ndarray = 길이가 4인 1차원 벡터
0:2], A2[0:2].shape A2[
(array([[ 1, 2, 3, 4],
[-1, -2, -3, -4]]),
(2, 4))
- shape이 (2,4)인 ndarray = dim이
2*4
인 행렬
0:1], A2[0:1].shape A2[
(array([[1, 2, 3, 4]]), (1, 4))
- shape이 (1,4)인 ndarray = dim이
1*4
인 행렬 A2[0:1]
은A2[0]
와 같은 코드가 아니었다!!
인덱싱: 결과가 어떻게 나올지 생각해보고 인덱싱 할 것
(예시1) 한개의 값을 뽑을때 -> 출력을 0차원,1차원,2차원으로 만들 수 있다.
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
0,0] # 출력이 0차원 A2[
1
0],0] # 출력이 1차원 A2[[
array([1])
0,[0]] # 출력이 1차원 A2[
array([1])
0:1,0] # 출력이 1차원 A2[
array([1])
0,0:1] # 출력이 1차원 A2[
array([1])
0:1,0:1] # 출력이 2차원 A2[
array([[1]])
(예시2) 하나의 벡터를 뽑을때 -> 출력을 1차원, 2차원으로 만들 수 있다.
A2
array([[ 1, 2, 3, 4],
[-1, -2, -3, -4],
[ 5, 6, 7, 8],
[-5, -6, -7, -8]])
1] # 출력이 1차원: 출력은 길이가 4인 벡터처럼 해석가능 A2[:,
array([ 2, -2, 6, -6])
1]] # 출력이 2차원: 출력을 4*1 매트릭스처럼 해석가능 A2[:,[
array([[ 2],
[-2],
[ 6],
[-6]])
-1,:] # 출력이 1차원: 출력을 길이가 4인 벡터처럼 해석가능 A2[
array([-5, -6, -7, -8])
-1],:] # 출력이 2차원: 출력을 1*4 매트릭스처럼 해석가능 A2[[
array([[-5, -6, -7, -8]])
1차원 배열의 선언
-
리스트나 튜플을 선언하고 형변환
1,2,3)) # 튜플->넘파이어레이 np.array((
array([1, 2, 3])
1,2,3]) # 리스트 ->넘파이어레이 np.array([
array([1, 2, 3])
-
range()를 이용해서 선언하고 형변환
range(10)) # range(10) -> 넘파이어레이 np.array(
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
-
np.zeros, np.ones
3) np.zeros(
array([0., 0., 0.])
4) np.ones(
array([1., 1., 1., 1.])
-
np.linspace
0,1,12) # 0에서 시작하고 1에서 끝남 (양끝점 모두 포함) np.linspace(
array([0. , 0.09090909, 0.18181818, 0.27272727, 0.36363636,
0.45454545, 0.54545455, 0.63636364, 0.72727273, 0.81818182,
0.90909091, 1. ])
len(np.linspace(0,1,12)) # 길이는 12
12
-
np.arange
5) # np.array(range(5)) np.arange(
array([0, 1, 2, 3, 4])
1,6) # np.array(range(1,6)) np.arange(
array([1, 2, 3, 4, 5])
reshape (\(\star\))
-
reshape: ndarray의 특수한 기능
=np.array([11,22,33,44,55,66])
a## 길이가 6인 벡터 a
array([11, 22, 33, 44, 55, 66])
2,3) ## (2,3) matrix 라고 생각해도 무방 a.reshape(
array([[11, 22, 33],
[44, 55, 66]])
note: reshape은 a자체를 변화시키는것은 아님
# a는 그대로 있음 a
array([11, 22, 33, 44, 55, 66])
= a.reshape(2,3) # a를 reshape한 결과를 b에 저장
b b
array([[11, 22, 33],
[44, 55, 66]])
# a는 여전히 그대로 있음 a
array([11, 22, 33, 44, 55, 66])
-
다시 b를 a처럼 바꾸고 싶다
b
array([[11, 22, 33],
[44, 55, 66]])
6) # b는 (2,3) matrix , 그런데 이것을 길이가 6인 벡터로 만들고 싶다. b.reshape(
array([11, 22, 33, 44, 55, 66])
-
reshape with -1
=np.arange(24) # np.array(range(24))
a a
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])
2,-1) a.reshape(
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]])
3,-1) a.reshape(
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]])
4,-1) a.reshape(
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,-1) a.reshape(
ValueError: cannot reshape array of size 24 into shape (5,newaxis)
6,-1) a.reshape(
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]])
7,-1) a.reshape(
ValueError: cannot reshape array of size 24 into shape (7,newaxis)
8,-1) a.reshape(
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]])
12,-1) a.reshape(
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]])
= a.reshape(12,-1)
b b
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]])
-1) # b를 다시 길이가 24인 벡터로! b.reshape(
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])
2차원 배열의 선언
3,3)) np.zeros((
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
3,3)) np.ones((
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
3) np.eye(
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
1,2,3,-1]) np.diag([
array([[ 1, 0, 0, 0],
[ 0, 2, 0, 0],
[ 0, 0, 3, 0],
[ 0, 0, 0, -1]])
랜덤으로 배열 생성
10) # 표쥰정규분포에서 10개를 뽑음 np.random.randn(
array([ 0.27184979, -0.4540305 , 0.24538219, -3.11389327, 1.06478234,
0.12051154, 0.01503231, -0.06744028, 2.30710253, 0.78840453])
10) # 0~1사이에서 10개를 뽑음 np.random.rand(
array([0.67729671, 0.19584606, 0.4564896 , 0.9308976 , 0.49080792,
0.03410752, 0.47480477, 0.44519947, 0.20608611, 0.85576604])
4).reshape(2,2) # 표준정규분포에서 4개를 뽑고 (2,2) ndarray로 형태변환 np.random.randn(
array([[-0.44348217, -0.04732516],
[ 0.75768436, -0.15208593]])
4).reshape(2,2) # 0~1 4개를 뽑고 (2,2) ndarray로 형태변환 np.random.rand(
array([[0.03708309, 0.56122376],
[0.80934488, 0.65723348]])
행렬관련기능
=np.arange(4).reshape(2,2)
A A
array([[0, 1],
[2, 3]])
# .T는 전치행렬을 구해줌 A.T
array([[0, 2],
[1, 3]])
# np.linalg.inv는 역행렬을 구해주는 함수 np.linalg.inv(A)
array([[-1.5, 0.5],
[ 1. , 0. ]])
@ np.linalg.inv(A) # @는 행렬곱을 수행 A
array([[1., 0.],
[0., 1.]])
넘파이 공부 3단계: 차원
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}\)
-
풀이
= np.array([[0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0]])
A A
array([[0, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 0, 1],
[1, 1, 1, 0]])
= np.array([3,3,3,3]).reshape(4,1)
b b
array([[3],
[3],
[3],
[3]])
@ b np.linalg.inv(A)
array([[1.],
[1.],
[1.],
[1.]])
-
다른풀이
b를 아래와 같이 만들어도 된다.
=np.array([3,3,3,3])
b b
array([3, 3, 3, 3])
# b.shape은 길이가 1인 튜플로 나온다. b.shape
(4,)
@ b np.linalg.inv(A)
array([1., 1., 1., 1.])
@
의 유연성
-
엄밀하게는 아래의 행렬곱이 가능하다.
- (2,2) @ (2,1) => (2,1)
- (1,2) @ (2,2) => (1,2)
= np.array([1,2,3,4]).reshape(2,2)
A = np.array([1,2]).reshape(2,1)
b @b A
array([[ 5],
[11]])
@b).shape A.shape, b.shape, (A
((2, 2), (2, 1), (2, 1))
= np.array([1,2,3,4]).reshape(2,2)
A = np.array([1,2]).reshape(1,2)
b @A b
array([[ 7, 10]])
@A).shape A.shape, b.shape, (b
((2, 2), (1, 2), (1, 2))
-
당연히 아래는 성립안한다.
= np.array([1,2,3,4]).reshape(2,2)
A = np.array([1,2]).reshape(2,1)
b @A b
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)
= np.array([1,2,3,4]).reshape(2,2)
A = np.array([1,2]).reshape(1,2)
b @b A
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,)
= np.array([1,2,3,4]).reshape(2,2)
A = np.array([1,2])
b @b A
array([ 5, 11])
@b).shape A.shape, b.shape, (A
((2, 2), (2,), (2,))
- b를 마치 (2,1)처럼 해석하여 행렬곱하고 결과는 다시 (2,) 로 만든것 같다.
@A b
array([ 7, 10])
@A).shape A.shape, b.shape, (b
((2, 2), (2,), (2,))
- 이때는 \(b\)를 마치 (1,2)처럼 해석하여 행렬곱하고 결과는 다시 (2,)로 만든것 같다.
-
아래는 어떠할까?
= np.array([1,2,3,4])
b1 = np.array([1,2,3,4])
b2 @b2 b1
30
@b2).shape b1.shape, b2.shape, (b1
((4,), (4,), ())
- (1,4) @ (4,1) = (1,1) 로 생각
-
즉 위는 아래와 같이 해석하고 행렬곱한것과 결과가 같다.
= np.array([1,2,3,4]).reshape(1,4)
b1 = np.array([1,2,3,4]).reshape(4,1)
b2 @b2 b1
array([[30]])
@b2).shape b1.shape, b2.shape, (b1
((1, 4), (4, 1), (1, 1))
-
때로는 (4,1) @ (1,4)와 같은 계산결과를 얻고 싶을 수 있는데 이때는 차원을 명시해야함
= np.array([1,2,3,4]).reshape(4,1)
b1 = np.array([1,2,3,4]).reshape(1,4)
b2 @b2 b1
array([[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12],
[ 4, 8, 12, 16]])
참고: 평균을 구하는 신기한 코드
= np.random.randn(100) x
1/100]*100) @ x ## x의 평균을 구하라는 의미 np.array([
0.04274275334613641
np.mean(x)
0.04274275334613641
HW
1
. shape이 ()인 numpy array를 만들어라. (즉 차원이 0인 np.array를 만들어라) // 2022-중간고사-1-(19)
(풀이)
= np.array(0)
a a.shape
()
2
a의 모든 원소에 1을 더하는 코드를 작성하라. // 2022-중간고사-1-(21)
=[1,3,2,5,-3,3,8,2,3,1] a
(풀이)
=[1,3,2,5,-3,3,8,2,3,1]
a+1 np.array(a)
array([ 2, 4, 3, 6, -2, 4, 9, 3, 4, 2])
3
아래와 같은 수열을 생생성하라. // 2022-중간고사-1-(23)
0,1,2,3,4,5,...,99
위의 수열에서 1,4,7,10,13,… 번째의 원소를 뽑아라. (첫번째 원소는 0이다)
(풀이)
100)[::3] np.arange(
array([ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48,
51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99])
4
. shape이 (5,5)인 단위행렬을 만들어라. // 2022-중간고사-1-(20)
(풀이)
5) np.eye(
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
5
. numpy를 이용하여 아래의 역행렬을 구하라. // 2022-중간고사-1-(24)
\[\begin{bmatrix} 1& 0 \\ 0& 3 \end{bmatrix}\]
(풀이)
= np.array([[1,0],[0,3]])
A np.linalg.inv(A)
array([[1. , 0. ],
[0. , 0.33333333]])
6
. 본인의 학번으로 랜덤시드를 설정하고 표준정규분포에서 1000개의 난수를 생성하라. // 2022-중간고사-1-(34)
# 학번이 2021-43052 라면 아래와 같이 시드설정
202143052) np.random.seed(
(풀이)
202143052)
np.random.seed(= np.random.randn(1000) x
7
. 6
의 결과로 나온 1000개의 난수중 1.96보다 크거나 -1.96보다 작은 작은값은 모두 몇개인가?
(풀이)
sum(x>1.96) + sum(x<-1.96)
54
8
. 아래와 같은 배열을 선언하라. // 2022-중간고사-1-(38)
=np.arange(12).reshape(3,4)
a a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
차원의 수를 유지하면서 1열을 추출하는 코드를 작성하라. 즉 결과가 아래와 같이 나오도록 하라.
array([[0],
[4],
[8]])
(풀이)
0]] a[:,[
array([[0],
[4],
[8]])
9
. 아래의 코드를 관찰하라. // 2022-중간고사-1-(40)
43052)
np.random.seed(=np.random.randint(low=20,high=25,size=(10,10)) a
a에서 20,21,22는 각각 몇개씩 있는가?
note 공부를 위하여 np.random.randint()
의 기능을 chatGPT등으로 확인해 볼 것
(풀이)
==20).sum(), (a==21).sum(), (a==22).sum() (a
(17, 20, 19)
10
. 아래의 코드를 관찰하라.
= [[i==j for i in range(5)] for j in range(5)]
lst lst
[[True, False, False, False, False],
[False, True, False, False, False],
[False, False, True, False, False],
[False, False, False, True, False],
[False, False, False, False, True]]
lst를 이용하여 shape이 (5,5)인 단위행렬을 만들어라.
# 출력결과는 아래와 같이 나와야 한다.
array([[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]])
(풀이)
==j for i in range(5)] for j in range(5)])*1.0 np.array([[i
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
12
. 적당한 코드를 이용하여 아래와 같은 리스트를 생성하라.
lst
[[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]]
이를 이용하여 아래와 같은 행렬을 선언하라.
arr
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
(풀이)
+j for i in range(5)] for j in range(5)] ) np.array([[i
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
13
. 적당한 코드를 이용하여 아래와 같은 행렬을 선언하라.
# 출력결과는 아래와 같아야 한다.
array([[1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1]])
(풀이)
abs(i-j)<2 for i in range(10)] for j in range(10)])*1 np.array([[
array([[1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1]])
14
. 아래와 같은 배열이 있다고 하자. // 2022-중간고사-1-(31)
=np.array([1,2,3,4,5])
a=np.array([3,2,1,1,2]) b
numpy의 @
연산자를 이용하여 \(\sum_{i=1}^{5}a_ib_i\)를 계산하라.
(풀이)
@b a
24
15
. 아래와 같은 배열을 생성하라. // 2022-중간고사-1-(32)
=np.random.randn(100) x
numpy의 @
연산자를 이용하여 \(\sum_{i=1}^{100}x_i^2\)을 계산하라.
(풀이)
@x x
973.559744500584
16
. 아래와 같은 배열을 생성하라. // 2022-중간고사-1-(33)
=np.array([1/100]*100)
a=np.random.randn(100) x
numpy의 @
연산자를 이용하여 \(\frac{1}{n}\sum_{i=1}^{n}x_i\)를 계산하라.
(풀이)
@x/100 x
9.73559744500584
17
. 성공확률이 45%인 시행을 100번 반복하여 성공하면 True, 실패하면 False를 기록하는 난수열을 생성하라.
hint:
# 0~1사이의 값이 임의로 생성 np.random.rand()
0.1721011158345127
< 0.45 # 0~1사이에 랜덤으로 생성된 값이 0.45보다 작다면 True를 리턴 np.random.rand()
False
(풀이)
100)<0.45 np.random.rand(
array([ True, False, False, True, True, True, True, False, False,
True, True, True, True, False, False, False, False, True,
False, True, False, True, False, True, True, False, False,
False, False, True, False, False, True, True, False, True,
True, True, False, True, False, True, False, True, True,
True, True, False, False, False, True, False, True, True,
True, False, True, False, False, False, False, False, True,
False, False, False, True, False, True, False, False, True,
False, True, True, True, False, False, True, False, True,
False, False, True, False, False, False, False, True, True,
False, True, True, True, True, False, False, False, False,
False])