Akashic Records

9.1 넘파이(Numpy) 본문

Python for Beginners

9.1 넘파이(Numpy)

Andrew's Akashic Records 2023. 3. 27. 14:28
728x90

NumPy는 파이썬의 과학 계산 라이브러리로, 다차원 배열 객체와 이러한 배열 작업을 위한 다양한 도구를 제공합니다. NumPy를 사용하면 수치 연산을 빠르게 수행할 수 있으며, 파이썬 기본 리스트에 비해 효율적으로 작동합니다.

NumPy 설치
먼저 NumPy를 설치해야 합니다. 터미널이나 명령 프롬프트에서 다음 명령을 실행하여 설치하세요.

pip install numpy


NumPy 임포트
NumPy를 사용하려면 먼저 코드에서 NumPy를 임포트해야 합니다.

import numpy as np

 

NumPy 배열 생성
NumPy에서 가장 기본적인 객체는 다차원 배열입니다. 이 배열은 동일한 유형의 값들로 구성되며, 차원을 축(axis)라고 합니다.

# 1차원 배열 생성
arr1 = np.array([1, 2, 3])

# 2차원 배열 생성
arr2 = np.array([[1, 2, 3], [4, 5, 6]])

# 배열 생성과 함께 형태(shape)와 데이터 유형(dtype) 지정
arr3 = np.array([[1, 2], [3, 4]], dtype=np.float64, shape=(2, 2))

 

NumPy 배열 속성
NumPy 배열의 속성을 사용하여 배열의 형태, 크기, 데이터 유형 등을 확인할 수 있습니다.

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

print(arr.shape)  # 배열의 형태: (2, 3)
print(arr.ndim)   # 배열의 차원 수: 2
print(arr.size)   # 배열의 원소 수: 6
print(arr.dtype)  # 배열의 데이터 유형: int64

 

NumPy 배열 생성 함수
NumPy는 배열을 생성하는 다양한 함수를 제공합니다.

# 모든 원소가 0인 배열 생성
zeros = np.zeros((2, 3))

# 모든 원소가 1인 배열 생성
ones = np.ones((2, 3))

# 특정 값으로 채워진 배열 생성
full = np.full((2, 3), 7)

# 단위 행렬 생성
identity = np.eye(3)

# 일정한 간격의 값들을 포함하는 배열 생성
linspace = np.linspace(0, 1, 5)

# 랜덤 값으로 채워진 배열 생성
random_arr = np.random.random((2, 3))

 

NumPy 배열 연산
NumPy는 벡터화된 연산을 지원하여 배열에 대한 빠른 수치 연산을 수행할 수 있습니다.

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

# 덧셈
c = a + b
print(c)

# 뺄셈
d = a - b
print(d)

# 곱셈
e = a * b
print(e)

# 나눗셈
f = a / b
print(f)


NumPy 인덱싱 및 슬라이싱
NumPy 배열의 특정 원소에 접근하거나 배열의 일부분을 추출할 수 있습니다.

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 인덱싱
print(arr[0, 1])  # 2

# 슬라이싱
print(arr[0:2, 1:3])
# 출력:
# [[2, 3]
#  [5, 6]]

 

불리언 인덱싱
불리언 인덱싱을 사용하여 배열에서 조건을 만족하는 원소를 추출할 수 있습니다.

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

# 조건에 따른 불리언 배열 생성
bool_idx = arr > 3

# 불리언 배열을 사용하여 조건을 만족하는 원소 추출
result = arr[bool_idx]
print(result)  # 출력: [4 5 6]

 

배열 형태 변경
배열의 형태를 변경하거나 전치할 수 있습니다.

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

# 배열의 형태 변경
reshaped = arr.reshape((3, 2))
print(reshaped)
# 출력:
# [[1, 2]
#  [3, 4]
#  [5, 6]]

# 배열 전치
transposed = arr.T
print(transposed)
# 출력:
# [[1, 4]
#  [2, 5]
#  [3, 6]]

 

배열 결합 및 분할
두 개 이상의 배열을 결합하거나 하나의 배열을 여러 개의 작은 배열로 분할할 수 있습니다.

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

# 배열 결합
combined = np.concatenate((a, b), axis=0)
print(combined)
# 출력:
# [[1, 2]
#  [3, 4]
#  [5, 6]
#  [7, 8]]

# 배열 분할
arr1, arr2 = np.split(combined, 2, axis=0)
print(arr1)
# 출력:
# [[1, 2]
#  [3, 4]]
print(arr2)
# 출력:
# [[5, 6]
#  [7, 8]]

 

유니버설 함수 (ufunc)

넘파이(Numpy)의 유니버셜 함수(Universal Functions, 또는 ufuncs)는 배열의 모든 원소에 대해 빠르게 연산을 수행하는 함수입니다. 유니버셜 함수는 벡터화된 래퍼(wrapper)로, 파이썬의 기본 반복문보다 훨씬 빠른 성능을 제공합니다. 단항 유니버셜 함수는 하나의 입력 배열에 작동하고, 결과를 반환하는 함수입니다.

주요 단항 유니버셜 함수들:

  • np.abs() 또는 np.fabs(): 절대값 계산
  • np.sqrt(): 제곱근 계산
  • np.square(): 제곱 계산
  • np.exp(): 지수 함수 계산 
  • np.log(), np.log10(), np.log2(): 자연 로그, 상용 로그, 밑이 2인 로그 계산
  • np.ceil(): 소수점 이하를 올림
  • np.floor(): 소수점 이하를 내림
  • np.rint(): 가장 가까운 정수로 반올림
  • np.sin(), np.cos(), np.tan(): 삼각 함수
  • np.arcsin(), np.arccos(), np.arctan(): 역삼각 함수
  • np.isnan(): NaN(Not a Number) 여부를 검사
  • np.isfinite(), np.isinf(): 유한한 수, 무한한 수 여부를 검사
import numpy as np

# 배열 생성
arr = np.array([-1, 0, 1, 2, 3, 4])

# 절대값
print("Abs:", np.abs(arr))

# 제곱근
print("Square root:", np.sqrt(arr))

# 제곱
print("Square:", np.square(arr))

# 지수 함수
print("Exponential:", np.exp(arr))

# 자연 로그 (음수나 0에 대해서는 경고 메시지가 발생할 수 있습니다.)
with np.errstate(divide='ignore', invalid='ignore'):
    print("Logarithm:", np.log(arr))

# 삼각 함수
print("Sine:", np.sin(arr))
print("Cosine:", np.cos(arr))

 

브로드캐스팅
브로드캐스팅은 서로 다른 형태의 배열끼리 연산을 수행할 때, 작은 배열을 자동으로 확장하여 큰 배열의 형태에 맞추는 방법입니다. 이를 통해 연산을 더 효율적으로 수행할 수 있습니다.

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([1, 0, 1])

# 브로드캐스팅을 사용하여 a와 b의 원소별 덧셈 수행
result = a + b
print(result)
# 출력:
# [[ 2  2  4]
#  [ 5  5  7]
#  [ 8  8 10]]

 

축을 따른 연산
배열의 축을 기준으로 한 연산을 수행할 수 있습니다. 이를 통해 행별 또는 열별로 합, 평균, 최댓값, 최솟값 등을 계산할 수 있습니다.

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

# 열별 합
col_sum = np.sum(a, axis=0)
print(col_sum)  # 출력: [12 15 18]

# 행별 평균
row_mean = np.mean(a, axis=1)
print(row_mean)  # 출력: [2. 5. 8.]

# 전체 최댓값 및 최댓값의 인덱스
max_val = np.max(a)
max_idx = np.argmax(a)
print(max_val)  # 출력: 9
print(max_idx)  # 출력: 8

 

선형 대수
NumPy는 기본적인 선형 대수 연산을 지원합니다. 행렬 곱셈, 역행렬, 행렬식, 고유값 및 고유벡터 계산 등의 연산을 수행할 수 있습니다.

import numpy as np

# 행렬 곱셈
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)
print(C)
# 출력:
# [[19 22]
#  [43 50]]

# 행렬식 계산
det = np.linalg.det(A)
print(det)  # 출력: -2.0000000000000004

# 역행렬 계산
inv = np.linalg.inv(A)
print(inv)
# 출력:
# [[-2.   1. ]
#  [ 1.5 -0.5]]

# 고유값과 고유벡터 계산
eigenvalues, eigenvectors = np.linalg.eig(A)
print(eigenvalues)  # 출력: [-0.37228132  5.37228132]
print(eigenvectors)
# 출력:
# [[-0.82456484 -0.41597356]

#  [ 0.56576746 -0.90937671]]

 

난수 생성
NumPy는 다양한 분포에서 난수를 생성하는 기능을 제공합니다.

# 균등 분포에서 난수 생성
uniform_random = np.random.rand(3, 4)  # 3x4 배열 생성
print(uniform_random)

# 표준 정규 분포에서 난수 생성
normal_random = np.random.randn(3, 4)  # 3x4 배열 생성
print(normal_random)

# 정수 범위에서 난수 생성
int_random = np.random.randint(0, 10, (3, 4))  # 0 이상 10 미만의 정수, 3x4 배열 생성
print(int_random)

 

NumPy는 배열 처리와 수치 계산에 강력한 도구를 제공하며, 데이터 분석, 머신러닝, 과학 연구 등 다양한 분야에서 활용됩니다. 이 외에도 NumPy는 많은 고급 기능과 함수를 제공하므로, 공식 문서 및 자습서를 참조하여 필요한 기능을 찾아 사용할 수 있습니다. 공식 문서 링크: https://numpy.org/doc/stable/

728x90

'Python for Beginners' 카테고리의 다른 글

9.3 데이터 시각화(Matplotlib, Seaborn 등)  (0) 2023.03.27
9.2 판다스(Pandas)  (0) 2023.03.27
8.3 웹 프레임워크  (1) 2023.03.24
8.2 웹 개발 API 사용법  (0) 2023.03.24
8.1 웹 스크래핑  (0) 2023.03.24
Comments