일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 라즈베리파이
- 제트팩 컴포즈
- 자바 소켓통신
- 객체 지향 언어 vs 절차 지향 언어 차이점
- 안드로이드
- ios
- 라즈베리파이 회로
- 2025 정보처리기사 필기
- 라즈베리파이 메모리
- jetpack compose
- rubikpi
- 개방폐쇄 원칙
- ondevice ai
- 디자인 패턴
- java 클래스 로딩
- 절차 지향 언어
- java 실행과정
- 라즈베리파이 led
- 네트워크프로그래밍
- Xcode
- 라즈베리파이 개발환경
- autolayout
- SWIFT
- 라즈베리파이 os
- static 맴버 로딩
- 포트넘버
- qualcomm ai hub
- 프로그래밍뷰
- 2025 정보처리기사
- numpy
- Today
- Total
From_Base
NumPy 라이브러리: Chapter3 (useful Functions & matplotlib) 본문
📌 행렬 병합/연결 concatenate : 행렬에 행 또는 열 추가하기
NumPy에서 행렬에 행 또는 열을 추가하고싶다면 numpy.concatenate(A,B) 와 같이 concatenate 메서드를 사용하면 된다.
기존행렬에 재료행렬을 병합함으로써 기존 행렬에 행이나 열을 추가하는 효과를 얻을 수 있는 것이다.
C = numpy.concatenate( (A, B), axis = n )
이때 concatenate의 첫번째 매개변수는 (병합 대상 행렬, 병합시킬 행렬)로 이루어진 튜플이고.
두번째 매개변수는 axis로, 병합의 축을 설정하는 매개변수이다.
행렬 병합의 경우 axis값은 0 or 1로,
axis=0 인 경우 병합의 축이 행으로 설정되어 - > 행 방향으로 연결, 즉 행렬의 하단에 행렬이 연결되어진다.
axis=1 인 경우 병합의 축이 열로 설정되어 - > 열 방향으로 연결, 즉 행렬의 우측에 행렬이 연결되어진다.
아래는 행렬 연결을 통한 행 추가를 보여주는 예시이다.
concatenate 예제 코드는 아래와 같다.
import numpy as np
# concatenate메서드로 행렬에 열과 행 추가하기
A = np.array([[10, 20, 30], [40, 50, 60]])
print(A.shape) # (2, 3)
# A matrix에 행(row)으로 추가될 row_add 행렬 정의.
# (3,) 벡터를 -> (1,3) matrix 로 형변환. 가로 벡터
# 벡터는 1차원이기때문에 2차원인 (1,3) matrix로 형변환하여야 함.
row_add = np.array([70, 80, 90]).reshape(1, 3)
# A matrix에 열(column)으로 추가될 coloumn_add 행렬 정의.
# (2,) 벡터를 -> (2,1) matrix 로 형변환. 세로 벡터
column_add = np.array([1000, 2000]).reshape(2, 1)
#axis는 축을 뜻하는 매개변수로,
#axis 값에따라서 행렬을 추가하는 방향 축이 달라짐.
# axis=0 : 행을 축으로 연결. 즉, 행이 추가되는 방향인 하단에 추가됨.
# axis=1 : 열을 축으로 연결. 즉, 열이 추가되는 방향인 우측에 추가됨.
# A matrix에 row_add 행렬을 추가한 matrix B 생성. axis값은 0이므로 행을 축으로하여 추가하였으니. 행으로 추가됨.
B = np.concatenate((A, row_add), axis=0)
print(B)
# A matrix에 column_add 행렬을 추가한 matrix C 생성. axis값은 1이므로 열을 축으로하여 추가하였으니. 열로 추가됨.
C = np.concatenate((A, column_add), axis=1)
print(C)
print(C.shape) # (2, 4) 형상으로 변경되었음을 확인할 수 있음. 열이 추가된 것!
concatenate는 머신러닝 개발에서 자주쓰이는 기법 중 하나이다.
머신러닝의 회귀(regression)코드 구현시, 가중치(weight)와 바이어스(bias)를 별도의 행렬로 구분하지않고
하나의 행렬로 취급하기위해서 => 행과 열을 추가해주는 기능을 가진 바로 이 행렬 연결, concatenate 메서드를 사용한다.
📌 NumPy loadtxt:
, 와 같은 분리자로 구분된 파일에서 데이터를 읽어들이기 위한 메서드이다.
아래의 예시는 , 로 구분되어있는 파일의 데이터들을 읽어들이는 구문이다.
numpy.loadtxt("파일이름" , separator=',')
이때, loadtxt 메서드는 행렬을 return 하기때문에 리턴값을 인덱싱 또는 슬라이싱을 이용하여 데이터를 분리해볼 수 있다.
이는 머신러닝 코드에서 입력데이터와 정답데이터를 분리하는데 유용하게 사용된다.
import numpy as np
# loadtxt function
# seperator로 구분된 파일에서 데이터를 읽어오는 함수
loaded_data = np.loadtxt('./data-01.csv', delimiter=',', dtype=np.float32)
x_data = loaded_data[ : , 0:-1]
t_data = loaded_data[:, [-1]]
# 데이터 차원 및 shape 확인
print("x_data.ndim = ", x_data.ndim, ", x_data.shape = ", x_data.shape)
print("t_data.ndim = ", t_data.ndim, ", t_data.shape = ", t_data.shape)
📌난수생성 ( random.rand() ):
rand 메서드는 0 과 1 사이의 임의의 랜덤 실수값을 반환해주는 함수이다.
(3) 처럼 매개변수값을 하나만 입력시 원소 3개짜리 벡터로 반환해주고, (1,3)처럼 매개변수값을 2개 입력하면 1행 3열짜리 행렬을 반환해준다. 각 벡터와 행렬의 원소값들은 랜덤 실수값이다.
rand 메서드는 가중치나 바이어스 등을 임의의 값으로 설정할때 주로 사용된다.
import numpy as np
# 0~1 사이의 난수 생성.
random_number1 = np.random.rand(3)
random_number2 = np.random.rand(1,3)
random_number3 = np.random.rand(3,1)
print("random_number1 ==", random_number1, ", random_number1.shape ==", random_number1.shape)
print("random_number2 ==", random_number2, ", random_number2.shape ==", random_number2.shape)
print("random_number3 ==", random_number3, ", random_number3.shape ==", random_number3.shape)
📌 max/min & argmax/argmin : 배열 내의 최소-최대 값 구하기 & 해당 인덱스
벡터 및 행렬과 같은 다중 원소들을 포함하는 컨테이너 자료구조 내에서 최대-최소값 & 해당 값의 인덱스를 쉽게 구해주는 numpy 메서드들이다.
벡터의 경우, 해당 벡터의 요소들 중에서 최대최소값을 도출해주지만, 행렬의 경우엔 추가로 axis 매개변수를 통해서 열 기준으로 최대-최소값을 얻어낼 것인지 행 기준으로 얻어낼 것인지를 명시해주어야한다.
✅ 벡터에서의 최대/최소값
import numpy as np
# 벡터의 최대값, 최소값, 최대값의 인덱스, 최소값의 인덱스
X = np.array([2,4,6,8])
print(f"np.max(X) == {np.max(X)}")
print("np.min(X) == {}".format(np.min(X)))
print("np.argmax(X) ==", np.argmax(X))
print("np.argmin(X) ==", np.argmin(X))
✅ 행렬에서의 최대/최소값
행렬에서는 반환값이 벡터이다. 행 기준 - 열 기준으로 최대최소값을 벡터구조로 나열하여 반환해주기 때문이다.
# 행렬의 최대값, 최소값, 최대값의 인덱스, 최소값의 인덱스
# 행렬의 경우, axis를 지정하여 행 또는 열 단위로 계산한다.
# axis=0: 열을 축으로 계산, axis=1: 행을 축으로 계산
X = np.array([[2,4,6], [1,2,3], [0,5,8]])
print("np.max(X) ==", np.max(X, axis=0)) # 각 열의 최대값을 모아서 벡터로 반환
print("np.min(X) ==", np.min(X, axis=0)) # 각 열의 최소값을 모아서 벡터로 반환
print("np.max(X) ==", np.max(X, axis=1)) # 각 행의 최대값을 모아서 벡터로 반환
print("np.min(X) ==", np.min(X, axis=1)) # 각 행의 최소값을 모아서 벡터로 반환
print("np.argmax(X) ==", np.argmax(X, axis=0)) # 각 열의 최대값의 인덱스를 모아서 벡터로 반환
print("np.argmin(X) ==", np.argmin(X, axis=0)) # 각 열의 최소값의 인덱스를 모아서 벡터로 반환
print("np.argmax(X) ==", np.argmax(X, axis=1)) # 각 행의 최대값의 인덱스를 모아서 벡터로 반환
print("np.argmin(X) ==", np.argmin(X, axis=1)) # 각 행의 최소값의 인덱스를 모아서 벡터로 반환
📌ones & zeros : 배열 생성 & 모든 요소 0 or 1로 초기화
주어진 형상의 배열(벡터 및 행렬)을 생성하고 해당 배열을 모든 요소들을 0 또는 1의 값으로 초기화해주는 간편한 메서드이다.
ones & zeros 는 앞서 기술한 concatenate 메서드와 함께 자주 사용되곤한다.
import numpy as np
# numpy.ones()와 numpy.zeros() 함수는 각각 모든 원소가 1 또는 0인 배열을 생성한다.
# 메서드에 작성한 형상의 배열을 생성하고, ones 인지 zeros인지에 따라 모든 원소를 1 또는 0으로 초기화한다.
A = np.ones([3,3])
print("A.shape ==", A.shape, ", A ==", A)
B = np.zeros([3,2])
print("B.shape ==", B.shape, ", B ==", B)
📌matplotlib 라이브러리 : 데이터 시각화 (그래프)
머신러닝 코드를 구현하는 실무에서는 실제 코드를 구현하기 전에, 입력 데이터의 분포와 모양을 먼저 그래프로 그려보고, 데이터의 특성과 분포를 파악 한 후에, 해당 데이터에 어떤 알고리즘이 가장 적합한지를 결정하는 추세이다.
이렇듯, 데이터의 분포와 데이터의 시각화를 위해서 가장 많이 사용되는 라이브러리가 바로 이 matplotlib 이다.
matplotlib 라이브러리의 많은 그래프 유형중에서 일반적으로 line plot 과 scatter plot 을 많이 사용한다.
✅ scatter plot (산점도 그래프)
import matplotlib.pyplot as plt
import numpy as np
x_data = np.random.rand(100)
y_data = np.random.rand(100)
plt.title("Scatter plot") # 그래프 제목
plt.grid() # xy축 격자무늬.그리드 표시
# 그래프의 종류, 색상, 마커를 설정하여 출력
# 그래프의 종류: scatter(산점도). 다른 종류로는 plot(선그래프), bar(막대그래프) 등이 있다.
# x축, y축 데이터: x_data, y_data
# 색상: color='b'는 파란색, color='r'은 빨간색, color='g'는 초록색
# 데이터 마커: marker='o'는 원형, marker='x'는 x표시, marker='*'는 별표시
plt.scatter(x_data, y_data, color='b', marker='o')
plt.show() # 그래프 출력
✅ line plot (선형 그래프)
import matplotlib.pyplot as plt
import numpy as np
# list comprehension을 사용하여 x_data, y_data를 생성
# list comprehension은 for문 + 표현식을 이용하여 리스트를 생성하는 방법
x_data = [ x for x in range(-5,5)]
y_data = [ y*y for y in range(-5,5)]
plt.title("line plot")
plt.grid()
# 선형 그래프의 경우 plot()메서드를 사용하면 된다.
plt.plot(x_data, y_data, color='b', marker='o')
plt.show()
✅ line plot2 (선형 그래프2)
import matplotlib.pyplot as plt
x_data = [ -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y_data = [ -8, -13, -0, 3, 6, -1, -5, -7, 1, 8, 7, 13, 17]
plt.title("line plot2")
plt.grid()
plt.plot(x_data, y_data, color='r', marker='x')
plt.show()
'AI > Python' 카테고리의 다른 글
NumPy 라이브러리: Chapter2 (dot product, broadcast, indexing/slicing, iterator) (0) | 2025.01.26 |
---|---|
NumPy 라이브러리: Chapter1 (array, vector, matrix, reshape) (2) | 2025.01.25 |