복습

240103복습

glenlee 2024. 1. 3. 23:37

## NumPy
- 선형대수, 행렬 수치연산과 관련된 라이브러리
- 문과생, 고졸인데, 전문대졸인데... 선형대수는 모르는데요?
    + 선형대수를 공부해야 합니까?


- NumPy 기반으로 ==> 통계, 머신러닝, 등등

# !pip install numpy 넘파이 설치

import streamlit as st

print(st.__version__)

import numpy as np

print(st.__version__)


import numpy as np # NumPy 라이브러리를 불러오기

print(np.__version__)

pip install numpy

숫자 어레이

num1 = [1, 2, 3, 4]
num2 = [3, 4, 5, 6]

num1 + num2



arr1 = np.array(num1)
arr2 = np.array(num2)
arr1

import numpy as np

# 배열 생성
arr = np.array([1, np.e, np.e**2, 10])

# 자연로그 계산
log_arr = np.log(arr)

print("원래 배열:", arr)
print("자연로그 계산된 배열:", log_arr)

data1 = [0, 1, 2, 3, 4, 5]
a1 = np.array(data1)
a1

a1.dtype # Python int  # Numpy int8, int16, int32, int64

어레인지

np.arange(0, 10, 2) #0부터 숫자 10개 2의 배수

np.arange(1, 10)

np.arange(12).reshape(4, 3) #reshape = 12수를 4줄으로 3행

np.arange(12).reshape(2, 2, 3) #두줄로 두개, 3행으로

b1 = np.arange(12).reshape(4, 3)
b1

b2 = np.arange(5)
b2

b2 = np.arange(5)
b2.shape

# 범위의 시작과 끝 정하기 배열 생성
np.linspace(1, 20, 10)

linspace

linspace는 수치해석 및 데이터 처리를 위한 Python의 NumPy 라이브러리 함수 중 하나입니다. "Linear Space"의 약어로, 주어진 범위 내에서 일정한 간격으로 선형적으로 등간격으로 값을 생성하는 역할을 합니다.

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)은 주어진 시작점(start)부터 끝점(stop)까지(stop을 포함하거나 제외할 수 있음) num 개수만큼의 값을 생성합니다. num은 선택적 파라미터로, 기본값은 50입니다.

예를 들어, np.linspace(0, 10, 5)는 0부터 10까지(포함)의 범위에서 등간격으로 5개의 값을 생성합니다. 기본적으로 endpoint는 True로 설정되어 있어 stop 값을 포함합니다.


np.linspace(0, np.pi, 20) # pi 원주율 = 원주율을 포함해 표시

np.zeros(10)

np.zeros((2, 2))

np.ones(10)

np.ones((2, 2))

## NumPy 기초 문법 배우는 이유
- 문과생 : 데이터 분석가, 기초문법 있구나! 넘어가면 끝.
- 이공계 : 수치연산, 배열, 수식을 활용해서 문제 풀이
    + 클래스, 딥러닝 클래스, NumPy를 활용해서 딥러닝 알고리즘을 적용해서 클래스 & 라이브러리
    + 밑바닥부터 시작하는 딥러닝3,

# 단위행렬
arr_I = np.eye(3)
arr_I

np.eye(3)는 NumPy에서 제공하는 함수 중 하나로, 주어진 크기의 단위 행렬(identity matrix)을 생성하는 함수입니다.

여기서 3은 행과 열의 크기를 나타내며, 이 경우 3x3 크기의 단위 행렬을 생성합니다. 단위 행렬은 주 대각선의 원소가 1이고, 나머지 원소들은 모두 0인 정사각형 행렬입니다.

아래는 np.eye(3)을 사용하여 3x3 크기의 단위 행렬을 생성하는 예시입니다.

import numpy as np

identity_matrix = np.eye(3)
print(identity_matrix)

arr_I.shape=([3, 3])
arr_I

arr_I.shape는 NumPy에서 배열(arr_I)의 모양(shape)을 나타내는 속성(attribute)입니다. NumPy의 배열은 다차원 데이터를 저장하는 데 사용되며, 배열의 모양은 각 차원에 있는 요소의 수를 나타냅니다.

arr_I.shape는 튜플 형태로 반환되며, 각 요소는 배열의 각 차원에 있는 요소의 수를 나타냅니다. 예를 들어, 2차원 배열의 경우 (행의 수, 열의 수)로 표시됩니다. 3차원 배열의 경우 (깊이, 행, 열)과 같이 표시됩니다.

예를 들어, 2x3 크기의 2차원 배열 arr_I의 경우 arr_I.shape는 (2, 3)과 같이 반환됩니다.

np.array(['1.5', '0.62']) # 데이터 형변환

dtype='U4'로 선언된 NumPy 배열은 각 요소가 최대 4글자인 문자열로 구성됩니다. 만약 배열에 "apple", "pear", "grape"와 같은 문자열을 저장한다면 이 데이터 타입으로 선언된 배열은 이 문자열을 저장할 수 있겠지만, "banana"와 같이 5글자 이상의 문자열은 잘릴 수 있습니다.


# astype() # pandas에서 사용가능
arr = np.array(['1.5', '0.62'])
num_arr = arr.astype(float)
num_arr.dtype

np.array(['1.5', '0.62'], dtype = float)

num_f1 = np.array([10, 21, 0.549, 4.75, 5.98])
num_f1 = num_f1.astype(int)
num_f1

# p.224
# 난수 무작위로 숫자를 추출한다

np.random.rand(2, 2, 4) # 0 ~ 1 사이의 실수 난수를 갖음

np.random.randint(1, 100, 10)  #randint 정수 랜덤

# 리스트 생성
my_list = [1, 2, 2, 3, 3, 3]

# 리스트를 set으로 변환
my_set = set(my_list)

print("중복 제거된 set:", my_set)

arr = np.array(['1.5', '0.62'])
num_arr = arr.astype(float)
num_arr.dtype

arr1 = np.array([10, 20, 30, 40])
arr2 = np.array([1, 2, 3, 4])

print(arr1 + arr2) # 덧셈
print(arr1 - arr2) # 뺄셈
print(arr1 * arr2) # 곱셈
print(arr1 / arr2) # 나눗셈

## 비교연산

arr1 > 20

## 통계 연산
- NumPy, 합, 평균, 표준 편차, 분산, 최솟값, 최댓값, 누적합, 누적 곱 메서드가 존재한다.
    + 기술통계량 (Descriptive Statistics) : 현재 데이터 상태를 표현(=묘사, Describe)한다.
- 통계 : 평균이 전부다! (Mean is Everything)

arr3 = np.arange(5)
arr3

arr3.sum()#합

arr3.mean()#평균

arr3.std() # 표준편차

arr3.var() # 분산

## 누적합과 누적곱
- cumsum() : 누적합
- cumprod() : 누적곱

arr4 = np.arange(1, 5)
arr4

arr4.cumsum() #누적 합

arr4.cumprod() #누적 곱



## 행렬연산
- 선형 대수(Linear Algebra)를 위한 2차원 배열 연산도 지원
- p229, 행렬곱, 전치행렬, 역행렬, 행렬식 사용 예시

A = np.array([0, 1, 2, 3]).reshape(2, 2)
A

B = np.array([3, 2, 0, 1]).reshape(2, 2)
B

A.dot(B)

A.transpose()

np.linalg.inv(A)

## 배열의 인덱싱과 슬라이싱 (p.230)
- string, list, tuple과 동일한 방법으로 접근

a1 = np.array([0, 10, 20, 30, 40, 50])
a1

a1[4]

# 50을 70으로 변경하고 싶음
a1[5] = 70
a1

# 리스트 통해서 추출
a1[[0, 2, 4]]

idx_list = [0, 2, 4]
a1[idx_list]

a2 = np.arange(10, 100, 10).reshape(3, 3)
a2

a2[1, 1]

# 90을 95로 변경
a2[2, 2] = 95
a2

a2[0] = [1, 2, 3] # 좋은 코드는 아니다!
a2

a2[0] = np.array([4, 5, 6]) # 정석
a2

a2[0] = np.array([4, 5, 6, 7]) # 에러 확인, 이유 생각
a2

- 2차원 배열의 행과 열 위치 지정해서 원소 추출
  + (행의 위치1, 열의 위치1) / 행의 위치 2, 열의 위치2)

a2

a2[[0, 2], [1, 1]]

a2[0, 0], a2[2, 1]

## 배열 조건문
- pandas 문법과 유사하다

a = np.array([1, 2, 3, 4, 5, 6])
a

[a>3]

a[a>3]

a % 2 == 0 # 실무에서는 이런 코드를 작성하는 것이 핵심!!!

 

'복습' 카테고리의 다른 글

240104복습  (1) 2024.01.05
loc 와 iloc의 차이  (1) 2024.01.05
231229 복습  (2) 2023.12.30
변수의 형태 chat gpt  (0) 2023.12.30
231228복습  (0) 2023.12.30