수달이네 기술 블로그

1. numpy 본문

AI공부/머신러닝

1. numpy

슬픈 수달이 2025. 11. 12. 21:51

넘파이란?

파이썬에서 사용되는 과학, 수학연산을 위한 라이브러리로 다차원 배열을 다루는데에 특화되어 있다.

  • 데이터 분석, 머신러닝, 과학 계산등에서 사용된다.
import numpy as np

넘파이의 특징과 기능

ndarray

ndarray(다차원 배열): 넘파이를 import하면 사용할 수 있는 배열 자료구조

  • c언어로 구현되어 연산이 빠르고 효율적이다. 큰 데이터 셋에서 수치 연산을 수행할 때 뛰어난 성능을 보인다.
  • 파이썬의 list와는 달리 한가지 데이터만 가질 수 있다.
import numpy as np

ndarr1 = np.array([1, 2, 3, 4])
print(ndarr1)
print(type(ndarr1)) # <class 'numpy.ndarray'>
print(type(ndarr1[0])) # <class 'numpy.int64'>

ndarr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(ndarr2)
print(type(ndarr2)) # <class 'numpy.ndarray'>
print(type(ndarr2[0])) # <class 'numpy.ndarray'>

리스트와 다르게 타입은 numpy.ndarray라 나타나며 int또한 numpy.int64값이 저장되는 것을 알 수 있다.

리스트를 ndarray로 만들어줄 수 있다.

# 리스트를 ndarray로 변환
list1 = [1, 2, 3, 4]
ndarr1 = np.array(list1)
print(ndarr1)
print(type(ndarr1))

# ndarray를 리스트로 변환
list2 = ndarr1.tolist()
print(list2)
print(type(list2))

그러나 ndarray는 같은 자료형만 들어갈 수 있는데 다른 자료형이 들어간 리스트가 들어간다면 어떻게 될까

ndarr2 = np.array([1, 2, 3.14, 4])
print(ndarr2)
print(type(ndarr2))
print(type(ndarr2[0]))
print(type(ndarr2[1]))
print(type(ndarr2[2]))
print(type(ndarr2[3]))

#[1.   2.   3.14 4.  ]
#<class 'numpy.ndarray'>
#<class 'numpy.float64'>
#<class 'numpy.float64'>
#<class 'numpy.float64'>
#<class 'numpy.float64'>

가장 큰 범주에 있는 값인 float로 모두 변환된 것을 알 수 있다.

ndarr3 = np.array([1, 2, 3.14, True])
print(ndarr3)
print(type(ndarr3))
print(type(ndarr3[0]))
print(type(ndarr3[1]))
print(type(ndarr3[2]))
print(type(ndarr3[3]))

#[1.   2.   3.14 1.  ]
#<class 'numpy.ndarray'>
#<class 'numpy.float64'>
#<class 'numpy.float64'>
#<class 'numpy.float64'>
#<class 'numpy.float64'>

bool형 또한 마찬가지로 float가 된다.

ndarr4 = np.array(['1', 2, 3.14, True])
print(ndarr4)
print(type(ndarr4))
print(type(ndarr4[0]))
print(type(ndarr4[1]))
print(type(ndarr4[2]))
print(type(ndarr4[3]))

# ['1' '2' '3.14' 'True']
# <class 'numpy.ndarray'>
# <class 'numpy.str_'>
# <class 'numpy.str_'>
# <class 'numpy.str_'>
# <class 'numpy.str_'>

위처럼 string 형이 포함되어있다면 문자열로 바뀐다.

ndarr3 = np.array([1, 2, 3.14, True], dtype=int)
print(ndarr3)
print(type(ndarr3))
print(type(ndarr3[0]))
print(type(ndarr3[1]))
print(type(ndarr3[2]))
print(type(ndarr3[3]))

# [1 2 3 1]
# <class 'numpy.ndarray'>
# <class 'numpy.int64'>
# <class 'numpy.int64'>
# <class 'numpy.int64'>
# <class 'numpy.int64'>

만약 위와 같이 강제로 변환시켜 주면 강제로 int형이 된다.

인덱싱과 슬라이싱도 지원한다.

ndarr1 = np.array(['🍓', '🍉', '🍌', '🍒', '🍑'])
print(ndarr1)
print(ndarr1.shape)

# 인덱싱
print(ndarr1[0])
print(ndarr1[4])
print(ndarr1[-1])
print(ndarr1[-2])

# 슬라이싱
print(ndarr1[0:3])
print(ndarr1[2:])
print(ndarr1[:3])

# ['🍓' '🍉' '🍌' '🍒' '🍑']
# (5,)
# 🍓
# 🍑
# 🍑
# 🍒
# ['🍓' '🍉' '🍌']
# ['🍌' '🍒' '🍑']
# ['🍓' '🍉' '🍌']

이차원 배열을 지원하는데 이걸 통해서 배열의 모양을 확인할 수도 있다.

ndarr1 = np.array([['🍓', '🍉'], [ '🍒', '🍑']])
print(ndarr1)
print(ndarr1.shape)

# [['🍓' '🍉']
#  ['🍒' '🍑']]
# (2, 2)

위와 같이 shape를 사용한다.

import pandas as pd

# 데이터 경로
data_path = '/kaggle/input/2025-2-data-solution-p-01/'
train = pd.read_csv(data_path + 'train.csv', index_col='id')
test = pd.read_csv(data_path + 'test.csv', index_col='id')
submission = pd.read_csv(data_path + 'submission.csv', index_col='id')

train.shape, test.shape
#((250000, 24), (50000, 23))

위 코드는 내가 진행하는 범주형 머신러닝 실습 코드이다.

여기서 shape를 사용하여 데이터의 구조를 확인할 수 있다.

인덱싱 상세

# 2차원 배열
ndarr2d = np.array([[1, 2, 3, 4],
                    [5, 6, 7, 8],
                    [9, 10, 11, 12]])
print(ndarr2d)
print(ndarr2d.shape)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
# (3, 4)

# 0행 가져오기
print(ndarr2d[0, :])
print(ndarr2d[0,])
print(ndarr2d[0])
# [1 2 3 4]
# [1 2 3 4]
# [1 2 3 4]

# 0열 가져오기
print(ndarr2d[:, 0])
# [1 5 9]
ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32])
idx = [2, 5, 9]
print(ndarr1[idx]) # ndarr1[[2, 5, 9]]

ndarr2d = np.array([[1, 2, 3, 4], 
                    [5, 6, 7, 8], 
                    [9, 10, 11, 12]])
print(ndarr2d[[0, 1], :])

#[[1 2 3 4]
# [5 6 7 8]]

위처럼 인덱스를 , 를통해 여러개를 가져오게 할 수도 있다.

또한 위와 같이 0, 1행의 모든 값을 다가져와 또한 할 수 있다.

boolean인덱싱

  • 아래처럼 true와 false를 통해 출력할 내용을 정해줄 수 있다.
ndarr1 = np.array(['🍓', '🍉', '🍌', '🍒', '🍑'])
sel = [True, False, True, True, False]
print(ndarr1[sel])
# ['🍓' '🍌' '🍒']

이걸 사용해서 아래처럼 boolean 인덱싱이 가능하다.

ndarr2d = np.array([[1, 2, 3, 4],
                    [5, 6, 7, 8],
                    [9, 10, 11, 12]])

print(ndarr2d > 7)            
print(ndarr2d[ndarr2d > 7])

# [[False False False False]
#  [False False False  True]
#  [ True  True  True  True]]
# [ 8  9 10 11 12]
  • 즉 array에서 true인 값만 출력할 수 있도록 할 수도 있다.

행렬연산

numpy에선 행렬연산이 가능하다.

  • (선형대수와 관련이 깊어 데이터 과학, 머신러닝, 통계 등에서 자주 사용한다.)
  • 선형대수: 벡터와 행렬을 사용해 공간과 변환을 다루는 수학의 한 분야입니다. 쉽게 말해, 여러 숫자를 체계적으로 배열한 벡터(리스트 같은 것)와 행렬(숫자가 격자로 배열된 표)을 이용해 데이터를 표현하고 조작하는 방법
a = np.array([[1, 2, 3],
              [2, 3, 4]])
b = np.array([[3, 4, 5],
              [1, 2, 3]])
print(a.shape, b.shape)

# 행렬 덧셈
print(a + b)

# 행렬 뺄셈
print(a - b)

# 행렬 원소별 곱셈
print(a * b)

# 행렬 나눗셈
print(a / b)
ndarr3 = np.array([[1, 2, 3],
                   [1, 2, 3],
                   [2, 3, 4]])
ndarr4 = np.array([[1, 2],
                   [3, 4],
                   [5, 6]])
print(ndarr3.shape)
print(ndarr4.shape)

print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))

print(ndarr3 @ ndarr4)
# 행렬 곱셈 또는 벡터 내적을 수행
np.dot(ndarr3, ndarr4)

'AI공부 > 머신러닝' 카테고리의 다른 글

5. selenium을 이용한 크롤링  (1) 2025.11.26
4. 공공 데이터셋 가져오기  (0) 2025.11.26
참고) 머신러닝/딥러닝 모델별 장단점 표  (0) 2025.11.25
3. matplot  (0) 2025.11.19
2. Pandas  (1) 2025.11.17