hanker

Python - NumPy 연산 및 함수 활용 본문

Python

Python - NumPy 연산 및 함수 활용

hanker 2025. 2. 14. 00:00
반응형

이전에 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도 지원한다. 

 

이러한 지원 기능을 통해 데이터를 보다 효율적으로 다룰 수 있게 된다.

 

끝.

반응형