일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- group by
- SQL
- 자바
- rsync
- JPA
- Python
- spring
- 차이점
- mssql
- MongoDB
- MariaDB
- java
- 티스토리챌린지
- 추상클래스
- DBMS
- 명령어
- 리눅스
- github
- docker
- oracle
- 오블완
- 트랜잭션
- mysql
- PostgreSQL
- Linux
- analytics4
- Javascript
- 호이스팅
- IntelliJ
- git
- Today
- Total
hanker
Python - NumPy 연산 및 함수 활용 본문
이전에 NumPy 배열(ndarray)을 생성하고 다루는 기본적인 방법을 알아봤는데,
이번 글에서는 NumPy 배열을 활용한 다양한 연산 및 함수에 대해서 알아보자!
1. 기본 연산
NumPy는 Python의 기본 연산자 (+, -, *, /, ** 등)를 활용하여 배열 요소 간의 연산을 빠르고 효율적으로 수행할 수 있다.
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([10, 20, 30, 40, 50])
# 배열 간 연산
print("덧셈:", arr1 + arr2) # [11 22 33 44 55]
print("뺄셈:", arr1 - arr2) # [-9 -18 -27 -36 -45]
print("곱셈:", arr1 * arr2) # [10 40 90 160 250]
print("나눗셈:", arr1 / arr2) # [0.1 0.1 0.1 0.1 0.1]
print("거듭제곱:", arr1 ** 2) # [ 1 4 9 16 25]
2. 스칼라 연산
NumPy에서는 배열의 각 요소에 스칼라 값을 한 번에 적용하는 연산을 쉽게 수행할 수 있다.
이때 NumPy는 브로드캐스팅(broadcasting) 이라는 개념을 이용한다.
2-1. 1차원 배열에서의 스칼라 연산
import numpy as np
# 1차원 배열 생성
a = np.array([1, 2, 3, 4, 5])
print("원본 배열 a:", a)
# 스칼라 덧셈: 배열의 각 요소에 3을 더함
print("a + 3:", a + 3) # 결과: [4 5 6 7 8]
# 스칼라 뺄셈: 배열의 각 요소에서 2를 뺌
print("a - 2:", a - 2) # 결과: [-1 0 1 2 3]
# 스칼라 곱셈: 배열의 각 요소에 2를 곱함
print("a * 2:", a * 2) # 결과: [2 4 6 8 10]
# 스칼라 나눗셈: 배열의 각 요소를 2로 나눔
print("a / 2:", a / 2) # 결과: [0.5 1. 1.5 2. 2.5]
# 스칼라 거듭제곱: 배열의 각 요소를 제곱함
print("a ** 2:", a ** 2) # 결과: [ 1 4 9 16 25]
2-2. 2차원 배열에서의 스칼라 연산
import numpy as np
# 2차원 배열 생성
b = np.array([[1, 2, 3],
[4, 5, 6]])
print("원본 배열 b:\n", b)
# 스칼라 덧셈: 배열의 모든 요소에 10을 더함
print("b + 10:\n", b + 10)
# 결과:
# [[11 12 13]
# [14 15 16]]
# 스칼라 곱셈: 배열의 모든 요소에 3을 곱함
print("b * 3:\n", b * 3)
# 결과:
# [[ 3 6 9]
# [12 15 18]]
2-3. 브로드캐스팅(Broadcasting) 개념
스칼라 연산은 브로드캐스팅 덕분에 배열의 모양에 상관없이 스칼라 값이 자동으로 확장되어 각 요소에 적용된다.
c = np.array([[1, 2],
[3, 4]])
result = c - 1 # c 배열의 모든 요소에 1을 뺌
print(result)
- 내부적으로 1을 [[1,1], [1,1]]로 확장하여 연산을 수행한다.
3. 행렬 연산
3-1. 행렬 곱 ( Matrix Multiplication )
행렬 곱을 수행하려면 np.dot() 또는 @ 연산자를 사용한다.
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 행렬 곱
print("행렬 곱 (dot product):\n", np.dot(A, B))
print("행렬 곱 (@ 연산자 사용):\n", A @ B)
3-2. 전치 행렬(Transpose)
행렬의 행과 열을 바꾸는 전치(transpose) 연산은 .T 속성을 사용하여 쉽게 수행할 수 있다.
import numpy as np
A = np.array([[1, 2], [3, 4]])
print("기존 행렬:\n", A)
print("전치 행렬:\n", A.T)
3-3. 역행렬 (Inverse Matrix)
행렬의 역행렬을 구할 때는 np.linalg.inv()를 사용한다.
import numpy as np
A = np.array([[1, 2], [3, 4]])
print("기존 행렬:\n", A)
print("역행렬:\n", np.linalg.inv(A))
3-4. 행렬식 (Determinant)
행렬의 행렬식을 구할 때에 np.linalg.det()를 사용한다.
import numpy as np
A = np.array([[1, 2], [3, 4]])
det_A = np.linalg.det(A)
print("A의 행렬식:", det_A)
3-5. 행렬 거듭제곱 (Matrix Power)
정방(행과 열의 개수가 동일)행렬의 거듭제곱을 구할 때 np.linalg.matrix_power()를 사용한다.
import numpy as np
A = np.array([[1, 2], [3, 4]])
# A의 3제곱
A_power3 = np.linalg.matrix_power(A, 3)
print("A의 3제곱:\n", A_power3)
4. 배열 정렬 및 조건 연산
4-1. np.sort() 함수
np.sort() 함수는 배열의 요소들을 정렬한 후 새로운 배열을 반환한다.
- 기본적으로 오름차순 정렬을 수행
- 다차원 배열의 경우, 축(axis) 별로 정렬된다.
import numpy as np
# 1차원 배열
print("1차원 배열 정렬 예\n")
arr = np.array([5, 2, 9, 1, 7])
sorted_arr = np.sort(arr)
print("원본 배열:", arr)
print("정렬된 배열:", sorted_arr)
# 2차원 배열
print("\n2차원 배열 정렬 예\n")
matrix = np.array([[8, 2, 5],
[1, 9, 3]])
# 기본적으로 axis=-1 (행 단위)로 정렬
sorted_matrix = np.sort(matrix)
print("원본 행렬:\n", matrix)
print("행 단위로 정렬된 행렬:\n", sorted_matrix)
# 열 단위 정렬 (axis=0)
sorted_matrix_axis0 = np.sort(matrix, axis=0)
print("열 단위로 정렬된 행렬:\n", sorted_matrix_axis0)
4-2. np.argsort() 함수
np.argsort() 함수는 정렬된 결과의 인덱스를 반환한다.
이를 통해 원본 배열에서 요소들의 순서 변경 정보를 확인할 수 있다.
import numpy as np
# 1차원 배열
arr = np.array([5, 2, 9, 1, 7])
indices = np.argsort(arr)
print("정렬에 따른 인덱스:", indices)
4-3. 불리언 인덱싱 (Boolean Indexing)
불리언 인덱싱을 사용하면 조건을 만족하는 요소만 선택하거나 수정할 수 있다.
import numpy as np
data = np.array([3, 6, 1, 8, 4])
print("5보다 큰 값:", data[data > 5])
4-4. np,where() 함수
np.where() 함수는 조건에 다라 값을 선택하거나, 새로운 배열을 생성할 때 유용하다.
- 조건이 참인 경우와 거짓인 경우 각각 다른 값을 할당할 수 있다.
import numpy as np
data = np.array([3, 6, 1, 8, 4])
# 조건: data의 값이 5보다 크면 'High', 그렇지 않으면 'Low'로 표시
result = np.where(data > 5, 'High', 'Low')
print("조건에 따른 결과:", result)
5. 활용 예제
5-1. 난수로 생성한 배열에서 특정 값 찾기
import numpy as np
random_arr = np.random.randint(0, 100, size=(5, 5))
print("랜덤 배열:\n", random_arr)
# 50보다 큰 값만 선택
print("50보다 큰 값:\n", random_arr[random_arr > 50])
5-2. 학생 성적 데이터 분석
import numpy as np
scores = np.array([85, 92, 78, 90, 88, 76, 95, 89])
print("평균 점수:", np.mean(scores))
print("최고 점수:", np.max(scores))
print("합격자(80점 이상):", scores[scores >= 80])
정리
배열 간의 기본 연산을 지원하고, NumPy의 집계 함수 (sum, mean, std, min, max)를 활용할 수 있다.
또한 선형대수 연산 및 Boolean Indexing도 지원한다.
이러한 지원 기능을 통해 데이터를 보다 효율적으로 다룰 수 있게 된다.
끝.
'Python' 카테고리의 다른 글
Python - Pandas를 활용한 데이터 분석 (설치 및 사용법) (0) | 2025.02.16 |
---|---|
Python - NumPy 배열(ndarray) 다루기 (0) | 2025.02.11 |
머신러닝 배우기(Python) - NumPy 설치 및 사용 방법 (1) (0) | 2025.02.09 |
Python - 함수를 생성하는 방법에 대해서 (1) | 2024.10.21 |
Python - 파이썬 스크립트 파일을 실행(exe)파일로 만들기! (2) | 2024.10.19 |