hanker

Python - NumPy 배열(ndarray) 다루기 본문

Python

Python - NumPy 배열(ndarray) 다루기

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

NumPy에서 ndarray는 핵심 객체이다.

 

이번 글에서는 ndarray를 생성하고 이를 효율적으로 다루는 방법에 대해서 알아보자.

 


1. ndarray 객체

 

ndarray는 NumPy에서 제공하는 N차원 배열 객체로, 동일한 데이터 타입을 가진 요소들이 배열 형태로 저장된다.

이는 대규모 데이터의 효율적인 저장과 빠른 연산을 가능하게 한다.

 


2. ndarray 생성 방법

 

2-1.  리스트를 이용하여 생성

가장 기본적인 방법은 내장 자료형인 리스트나 중첩 리스트를 np.array() 함수에 전달하여 ndarray로 변환하는 방법이 있다.

import numpy as np

# 1차원 배열 생성
arr1 = np.array([1, 2, 3, 4])
print("1차원 배열:", arr1)  # 출력: [1 2 3 4]

# 2차원 배열 생성 (리스트의 리스트 사용)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("2차원 배열:\n", arr2)

- 이 방법은 파이썬 리스트의 구조를 그대로 반영하면서도 고속 수치 연산이 가능한 ndarray로 변환한다.

 

 

2-2. 특정 값으로 채워진 배열 생성

- np.zeros(shape): 모든 원소가 0인 배열을 생성

- np.ones(shape): 모든 원소가 1인 배열을 생성

- np.empty(shape): 초기화되지 않은(임의의 값이 들어있는) 배열을 생성

# 1차원 배열 (길이 5)
zeros_arr = np.zeros(5)
ones_arr = np.ones(5)
empty_arr = np.empty(5)

print("Zeros:", zeros_arr)
print("Ones:", ones_arr)
print("Empty:", empty_arr)

# 2차원 배열 (2행 3열)
zeros_matrix = np.zeros((2, 3))
ones_matrix = np.ones((2, 3))
print("2x3 Zeros:\n", zeros_matrix)
print("2x3 Ones:\n", ones_matrix)

- 배열의 크기(shape)를 튜플로 지정하여 원하는 차원의 배열을 손쉽게 만들어준다.

 

 

2-3. 범위와 간격을 지정하여 배열 생성

- np.arange(start, stop, step) : 지정한 범위 내에서 일정한 간격으로 숫자배열을 생성

- np.linspace(start, stop, num) : 시작값과 끝값 사이를 균등하게 나눈 num 개의 값을 포함하는 배열을 생성

 

 

2-4. 특정 값으로 채워진 배열 생성

-np.full(shape, fill_value): 지정한 값(fill_value)으로 배열을 생성

# 2x2 배열을 7로 채우기
full_arr = np.full((2, 2), 7)
print("Full 배열:\n", full_arr)

 

2-5. 특수 행렬 생성

- np.eye(N) : N x N 크기의 단위 행렬(identity matrix)을 생성

- np.diag(v) : 벡터 v의 값을 대각선 원소로 하는 행렬을 생성하거나, 배열의 대각 성분을 추출

# 3x3 단위 행렬
identity_matrix = np.eye(3)
print("단위 행렬:\n", identity_matrix)

matrix = np.arange(4).reshape(2,2)
print("matrix : \n", matrix)

vector = np.diag(matrix)
print("diag : \n", vector)

* .reshape()는 5. 배열의 형태 변환에서 설명

 

 

2-6. 난수로 배열 생성

- np.random.rand(d0, d1, ...): 0과 1 사이의 균일 분포 난수를 사용하여 지정한 모양의 배열을 생성

- np.random.randint(low, high, size): low이상 high 미만의 정수 난수를 생성하여 배열로 만든다.

# 2x4 배열: 0과 1 사이의 난수
rand_arr = np.random.rand(2, 4)
print("난수 배열 (rand):\n", rand_arr)

# 3x3 배열: 0 이상 10 미만의 정수 난수
rand_int_arr = np.random.randint(0, 10, size=(3, 3))
print("난수 배열 (randint):\n", rand_int_arr)

 


3. 배열의 속성 확인

 

생성된 ndarray의 다양한 속성을 확인할 수 있다.

속성 확인 함수 정의
ndarray.ndim 배열의 차원 수
ndarray.shape 배열의 형태 (각 차원의 크기)
ndarray.size 배열의 전체 요소 수
ndarray.dtype 배열 요소의 데이터 타입
ndarray.itemsize 하나의 요소가 차지하는 메모리 크기(바이트 단위)
ndarray.nbytes 배열이 차지하는 전체 메모리 크기(바이트 단위)
array = np.array([[1, 2, 3], [4, 5, 6]])

print("차원 수:", array.ndim)
print("형태:", array.shape)
print("전체 요소 수:", array.size)
print("데이터 타입:", array.dtype)
print("요소 하나의 메모리 크기:", array.itemsize, "bytes")
print("전체 메모리 크기:", array.nbytes, "bytes")

 


4. 배열의 인덱싱과 슬라이싱

 

ndarray는 Python의 리스트와 유사하게 인덱싱과 슬라이싱을 지원한다.

이를 통해 배열의 특정 요소나 부분 배열을 쉽게 접근하고 수정할 수 있다.

 

4-1. 인덱싱

array = np.array([10, 20, 30, 40, 50])

# 첫 번째 요소 접근
print("첫 번째 요소:", array[0])

# 마지막 요소 접근
print("마지막 요소:", array[-1])

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

# 첫 번째 행, 두 번째 열의 요소 선택
print("첫 번째 행, 두 번째 열의 요소:", array_2d[0, 1])

 

 

4-2. 슬라이싱

array = np.array([10, 20, 30, 40, 50])

# 첫 번째부터 세 번째 요소까지 선택
print("첫 번째부터 세 번째 요소:", array[0:3])

# 처음부터 2칸씩 건너뛰며 선택
print("2칸씩 건너뛰며 선택:", array[::2])

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

# 첫 번째 행 선택
print("첫 번째 행:\n", array_2d[0, :])

# 첫 번째 열 선택
print("첫 번째 열:\n", array_2d[:, 0])

# 특정 부분 선택 (왼쪽 위 2x2 부분)
print("왼쪽 위 2x2 부분:\n", array_2d[0:2, 0:2])

 


5. 배열의 형태 변환 (Reshape & Flatten)

 

flatten()과 reshape()를 사용하여 배열의 형태를 변환할 수 있다.

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

# 2차원 배열을 1차원 배열로 변환
flattened = array.flatten()
print("1차원 배열:\n", flattened)

# 1차원 배열을 2차원 배열로 변환
reshaped = array.reshape(3, 2)
print("2x3 형태로 변환:\n", reshaped)

 


정리

 

NumPy의 ndarray는 다차원 배열을 효율적으로 다룰 수 있는 강력한 도구이다.

다양한 방법으로 배열을 생성하고, 배열의 속성을 확인하여 크기와 형태를 쉽게 파악이 가능하다.

인덱싱, 슬라이싱, 배열 변형 등을 활용하여 데이터를 자유롭게 조작해보자!

 

반응형