From_Base

NumPy 라이브러리: Chapter3 (useful Functions & matplotlib) 본문

AI/Python

NumPy 라이브러리: Chapter3 (useful Functions & matplotlib)

base_coding 2025. 1. 30. 23:50


📌 행렬 병합/연결 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 메서드를 이용한 행렬 연결 -> 행 추가

 

 

 

 

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()

 

선형 그래프2