📌
### numpy 데이터 연산
# 1차원 배열의 연산
# 빼기
a = np.array([20,30,40,50])
b = np.arange(4) # (0,1,2,3)
c = a-b # 각각의 요소들을 연산
c # array([20, 29, 38, 47])
# 더하기
c = a+b # 각각의 요소들을 연산
c # array([20, 31, 42, 53])
# 제곱
c = b**2 # b 요소들 각각의 제곱
c # array([0, 1, 4, 9], dtype=int32)
# < 사용
c = a < 35 # a 배열의 요소를 35와 비교하여 작으면 True, 크면 False
c # array([ True, True, False, False])
# 2차원 배열의 연산
a = np.array([[1,1],[0,1]])
b = np.array([[2,0],[3,4]])
a
b
# 더하기
c = a+b # 각각의 요소를 연산
c # array([[3, 1],[3, 5]])
# 빼기
c = a-b # 각각의 요소를 연산
c # array([[-1, 1],[-3, -3]])
# 곱하기
c = a*b
c # array([[2, 0],[0, 4]])
# 행열의 곱. dot : @
# 모든 행과 열들의 곱
#1
c = a @ b
c # array([[5, 4],[3, 4]])
'''
a @ b = c
행 [1,1] [2,0] = [1*2+1*3][1*0+1*4] [5,4]
행 [0,1] [3,4] = [0*2+1*3][0*3+1*4] [3,4]
'''
#2
c = a.dot(b)
c # array([[5, 4],[3, 4]])
📌
# 난수를 이용한 배열 생성
rg = np.random.default_rng(1) # seed를 설정해주는 방법. 1로 설정
rg
a = rg.random((2,3)) # 튜플로 생성. 2행 3열 배열. 0~1사이의 난수
a # array([[1, 1],[0, 1]])
b = np.ones((2,3),dtype=int)
b
a.dtype # 'float64'
b.dtype # 'int32'
c = a+b # 실수형 = 실수형 + 실수형
c = b+a # 실수형 = 실수형 + 실수형
c
a += b # 실수형 = 실수형 + 정수형
a
a.dtype # 'float64'
b += a # 오류. 정수형 = 정수형 + 실수형
# a배열의 전체요소들의 합
a.sum()
# a 배열의 전체 요소들 중 최소값
a.min()
# a 배열릐 전체요소들 중 최대값
a.max()
# a 배열의 전체요소들 중 평균값
a.mean()
# a 배열의 전체요소들 중 중간값
a.median() # 요류. median() 함수 없음
# a 배열의 전체요소들 중 표준편차값
a.std()
📌
# 1차원 배열
a # 1차원 배열. 2열 3행
# a 배열의 행 중 최대값
a.max(axis=1) # 열로 계산하여야 한다.
# array([1.9504637 , 1.94864945])
# a 배열의 열 중 최대값
a.max(axis=0) # array([1.94864945, 1.9504637 , 1.42332645])
# a배열의 행 중 최소값
a.min(axis=1) # array([1.14415961, 1.31183145])
# a배열의 열 중 최소값
a.min(axis=0) # array([1.51182162, 1.31183145, 1.14415961])
# a배열의 행 별 합계값
a.sum(axis=1) # array([4.60644493, 4.68380735])
# a배열의 열 별 합계값
a.sum(axis=0) # array([3.46047107, 3.26229515, 2.56748606])
# a배열의 행 별 누적합계값
a.cumsum(axis=1) # array([[1.51182162, 3.46228532, 4.60644493],
# [1.94864945, 3.2604809 , 4.68380735]])
# a배열의 열 별 누적합계값
a.cumsum(axis=0) # array([[1.51182162, 1.9504637 , 1.14415961],
# [3.46047107, 3.26229515, 2.56748606]])
# 10부터 49까지의 c 배열을 생성하기
c = np.arange(10,50)
c
# 첫번째 값 출력하기
c[0] # 10
# 첫번째 ~ 4번째까지의 값 출력하기
c[:4] # 0번 인덱스부터 3번인덱스까지
c[0:4] # 0번 인덱스부터 3번인덱스까지
# 4번 인덱스의 값을 100으로 변경
c[4] = 100
c[4] # 100
c[:5]
# 처음부터 3씩 증가하여 10번 인덱스까지 조회하기
#1
c[:11:3]
c[:11]
#2
c[:11] += 3
c[:11]
📌
# 2차원 배열 조회
# 0부터 11까지의 숫자를 3행 4열 배열 d로 생성하기
d = np.arange(0,12).reshape(3,4)
d
# 1행 1열의 값을 조회하기
d[1,1] # 5
d[0:2,0:2] # 1행까지, 1열까지 조회. array([[0, 1],[4, 5]])
d[:2,:2] # 1행까지, 1열까지 조회. array([[0, 1],[4, 5]])
d[::2,::2] # 2씩 증가. array([[ 0, 2],[ 8, 10]])
# 1의 값으로 채워진 10행 10열 배열 e 생성하기
e = np.ones((10,10))
e
# e 배열의 가장자리는 1로 내부는 0으로 채워진 배열로 수정하기
#1
e[1:9,1:9] = 0
e
#2
e[1:-1,1:-1] = 0
e
# e배열과 같은 모양의 배열 f 생성하기
f = np.zeros((8,8))
f
'''
행과 열에 각각 1인 값의 행열을 추가하기
pad() : 행, 열을 추가.
pad_width=1 : 추가될 행과 열의 갯수
constant_values=1 : 추가되는 배열의 값
'''
f = np.pad(f,pad_width=1,constant_values=1)
f
f.shape # (10, 10)
# np.fromfunction() : 함수를 이용하여 요소의 값 설정
# np.fromfunction(함수명,(행,열),요소자료형)
def f(x,y) : # x : 행의 인덱스, y : 열의 인덱스
return 10*x+y
'''
f(0행,0열) : 0
f(0행,1열) : 1
f(0행,2열) : 2
f(0행,3열) : 3
..
f(1행,0열) : 10
f(1행,1열) : 11
..
f(2행,0열) : 20
..
g[0,1,2,3],
[10,11,12,13],
[20,21,22,23],
..
'''
g = np.fromfunction(f,(5,4),dtype=int)
g
# g배열의 0행 출력하기
g[0] # array([0, 1, 2, 3])
# g배열의 0열 출력하기
g[:,0] # : => 모든 행, 0:0열
# array([ 0, 10, 20, 30, 40])
# g배열의 2열 출력하기
g[:,2] # : => 모든 행, 0:2열
# g 배열의 0,1행,0,1열 출력하기
g[:2,:2] # array([[ 0, 1],[10, 11]])
📌
# 난수를 이용하여 0~9사이의 정수값을 가진 임의의 수를 3행 4열로 배열 생성
# np.floor : 작은 근사정수
# np.ceil : 큰 근사정수
h = np.floor(np.random.random((3,4)) *10)
h
h.ndim # 2차원
h.shape # (3, 4)
# h배열을 1차원 배열 h1으로 변경하기
h1 = h.ravel() # h배열이 변경되지는 않음.
h1.ndim # 1차원
h1.shape # (12,)
# h배열을 6행 2열 배열로 h2 변경하기
h2 = h.reshape(6,2)
h2.shape # (6, 2)
h.shape # (3, 4)
# h배열 자체를 6행2행의 배열로 변경하기
h.resize(6,2)
h.shape # (6, 2)
# h배열을 3행 5열로 변경하기.
h.reshape(3,5) # 오류. h배열의 요소개수가 12개. 3행5열 : 15개
# 개수가 맞지 않아 불가능.
h.shape # (6, 2)
# 3행을 지정. 열의 값을 -1로 지정하면, 열을 자동으로 맞춰줌
h.reshape(3,-1) # -1을 지정하면 자동으로 맞춰준다.
h.reshape(4,-1).shape # (4, 3)
# 열을 지정하고 행의 값을 -1로 지정하면, 행을 자동으로 맞춰줌
h.reshape(-1,4).shape # (3, 4)
📌
# 0~9사이의 정수형 난수값을 가진 2행2열 i 배열 생성
# randint : 정수형 난수 리턴. 10 : 0~9사이의 임의의 값
i = np.random.randint(10,size=(2,2))
i # array([[7, 0],[8, 1]])
j = np.random.randint(10,size=(2,2))
j # array([[8, 8],[5, 1]])
# 2개의 배열을 합치기
np.vstack((i,j)) # 행을 합해준다. 열의 개수가 같아야 한다. (4행 2열)
np.hstack((i,j)) # 열을 합해준다. 행의 개수가 같아야 한다. (2행 4열)
# 배열 나누기. 2개의 배열로 분리
k = np.random.randint(10,size=(2,12))
k
np.hsplit(k,3) # 3개로 열을 분리. 4개씩 분리된다.
np.vsplit(k,2) # 2개로 행을 분리.
# k배열의 모든 요소값을 100으로 변경하기
# 불가 : k = 100. k변수에 100이라고 하는 변수값을 저장함.
# k값은 배열이 아님.
#1
k[:]=100
#2
k[:,:]=100
k
📌
# 0~19사이의 임의의 정수를 가진 5행 4열 배열 l을 생성하기
l = np.random.randint(20,size=(5,4))
l
# 각 행의 최대값들만 조회하기
l.max(axis=1)
# 각 열의 최대값들을 조회하기
l.max(axis=0)
# 각 행의 최대값의 인덱스를 조회하기
l.argmax(axis=1) # array([1, 2, 1, 1, 0], dtype=int64)
# 각 열의 최대값의 인덱스를 조회하기
l.argmax(axis=0) # array([4, 2, 1, 4], dtype=int64)
# 각 행의 최소값의 인덱스를 조회하기
l.argmin(axis=1) # array([2, 3, 0, 0, 1], dtype=int64)
# 각 열의 최소값의 인덱스를 조회하기
l.argmin(axis=0) # array([3, 4, 3, 1], dtype=int64)
📌
# 단위행령 : 대각선(이차원 배열에서 행과 열의 값이 같은. 행 == 열) 셀의 값이
# 1인 배열
m = np.eye(10,10) # 10행 10열 단위행렬
m
# m배열의 0이 아닌 요소의 인덱스 조회하기
# np.nonzero() : 요소의 값이 0이 아닌 요소의 인덱스 리턴
np.nonzero(m) # (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64),
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64))
n = [1,2,0,4,0] # 리스트
type(n) # list
np.nonzero(n) # (array([0, 1, 3], dtype=int64),)
# 정규분포값을 가진 임의의 수 10000개를 가진 배열
# np.random.normal : 정규분포에 맞는 난수 발생 함수
# (0,1,10000) : (평균, 표준편차,데이터개수)
# 평균이 0, 표준편차가 1인 난수들
o = np.random.normal(0,1,10000)
o
# 평균
o.mean()
# 표준편차
o.std()
# 정규분포 확인 : 히스토그램을 이용하여 확인
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
plt.hist(o,bins=100)
📌
# choice 함수 : 값을 선택
# choice(값의 범위, 선택갯수,재선택여부)
#(10,5,replace=False)
# 10 : 0 ~ 9사이의 값
# 5 : 5개 선택
# replace=True/False : 중복가능/불가능
q = np.random.choice(10,5,replace=False)
q
# 1~45 사이의 수를 중복없이 6개를 선택한 r 배열 생성.
r = np.random.choice(45,6,replace=False)+1
r
# 정렬
r.sort()
# 0에서 3사이의 수를 중복없이 5개 선택하기.
s = np.random.choice(3,5,replace=False) # 오류. 중복이 되어야 한다.
s = np.random.choice(3,5,replace=True)
s
📌
# 확률 적용 선택
# p=[0.1,0.2,0.3,0.2,0.1,0.1]
# p의 전체 합 : 1
p=[0.1,0.2,0.3,0.2,0.1,0.1]
sum(p) # 1.0
# choice(값의 범위 6,선택개수 100, 확률)
'''
선택 수 확률 100개 선택시 추정갯수
0 0.1 10
1 0.2 20
2 0.3 30
3 0.2 20
4 0.1 10
5 0.1 10
'''
t = np.random.choice(6,100,p=[0.1,0.2,0.3,0.2,0.1,0.1])
listt = list(t) # 리스트 <= 배열
listt.count(0) # 15
listt.count(1) # 19
listt.count(2) # 29
listt.count(3) # 21
listt.count(4) # 11
listt.count(5) # 5
fruits = ["apple","banana","cherries","durian","grapes"]
u = np.random.choice(fruits,100,p=[0.1,0.2,0.3,0.2,0.2])
u
listu = list(u) # 리스트 <= 배열
for d in fruits :
print(d,"=",listu.count(d))
'수업(국비지원) > Python' 카테고리의 다른 글
[Python] 데이터 전처리 (0) | 2023.04.25 |
---|---|
[Python] 빅데이터 분석 예제 (0) | 2023.04.25 |
[Python] numpy 행렬 (0) | 2023.04.25 |
[Python] 지도를 이용한 시각화2 (0) | 2023.04.25 |
[Python] 지도를 이용한 시각화1 (0) | 2023.04.25 |