본문 바로가기
수업(국비지원)/Python

[Python] numpy 연산

by byeolsub 2023. 4. 25.

 📌

### 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