김복칠 2024. 4. 1. 15:34

1. 넘파이(Numpy)

더보기

넘파이(Numpy)는 파이썬에서 사용되는 과학 및 수학 연산을 위한 강력한 라이브러리입니다. 주로 다차원 배열을 다루는 데에 특화되어 있어, 데이터 분석, 머신러닝, 과학 계산 등 다양한 분야에서 널리 사용됩니다. 넘파이 배열은 C 언어로 구현되어 있어 연산이 빠르고 효율적입니다. 특히 큰 데이터셋에서 수치 연산을 수행할 때 뛰어난 성능을 보입니다. 또한 메모리 사용을 최적화하고 효율적으로 관리합니다.

!pip install numpy
  • 먼저 필요로 하는 모듈인 numpy를 install 해줍니다

2. 넘파이의 주요 특징과 기능

2-1. 다차원 배열(N-dimensional array)

더보기

넘파이의 핵심은 다차원 배열인 ndarray 입니다. 이 배열은 동일한 자료형을 가지는 원소들로 이루어져 있습니다. 다차원 배열은 1차원, 2차원, 3차원 등 다양한 차원을 가질 수 있습니다.

# 리스트
list1 = [1,2,3.4]
list2 = [[1,2,3.4],[5,6,7,8]]
print(list1)
print(list2)
print(type(list1),type(list2))

print(type(list1[0]))
print(type(list2[0]))
# 결과 : [1, 2, 3.4] // [[1, 2, 3.4], [5, 6, 7, 8]] // <class 'list'> <class 'list'> // <class 'int'> // <class 'list'>
  • 먼저 list1, list2 라는 이름을 가진 변수를 두개 만들어 줍니다
  • 그리고 그 안에 [] 로 구성된 데이터를 만들어 주는데 괄호를 하나와 두개 씌워 줍니다
  • 배열의 구성을 확인해 보면 [] 괄호로 구성된 데이터는 list인걸 확인할 수 있습니다
  • 또한 그 안에 들어있는 데이터의 인덱싱을 확인해보면 리스트 안에 들어있는 리스트는 인덱싱으로 확인했을때도 list로 나타나는걸 확인할 수 있습니다
import numpy as np

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

# 2차원 배열
ndarr2 = np.array([[1,2,3],[4,5,6]])
print(ndarr2)
# 결과 : [1 2 3 4] // <class 'numpy.ndarray'> // <class 'numpy.int64'> // [[1 2 3][4 5 6]]
  • 이젠 리스트를 ndarray 형태로 바꾸어 보겠습니다
  • numpy를 np로 단어를 바꾸어주고 ndarr1 변수를 만들어서 넣어줍니다
  • 이를 확인해보면 데이터는 리스트가 아닌 배열 형태로 바뀌고 타입도 ndarray 형태로 바뀌는걸 알 수 있습니다
  • 2차원 또한 동일합니다

2-2. 리스트와 ndarray 변환

더보기
데이터 타입을 다른 데이터 타입으로 변환할 수 있습니다. 리스트에서 배열로의 변환은 np.array() 함수를 사용하고, 배열에서 리스트로의 변환은 tolist() 메서드를 사용합니다.
# 리스트를 ndarray로 변환
list1=[1,2,3,4]
ndarr1 =np.array(list1)
print(ndarr1)
print(type(ndarr1))
# 결과 : [1 2 3 4] // <class 'numpy.ndarray'>

# ndarray를 리스트로 변환
list2 = ndarr1.tolist()
print(list2)
print(type(ndarr2))
# 결과 : [1, 2, 3, 4] // <class 'numpy.ndarray'>
  • 이제 배열로 출력되는 ndarray 형태의 데이터를 리스트로 출력되게 바꾸어 보겠습니다
  • ndarray 형태의 변수 ndarr1를 tolist() 함수를 사용해면 type은 유지시키고 배열을 리스트로 바뀌는걸 확인할 수 있습니다

2-3. ndarray의 데이터 타입

더보기

넘파이의 ndarray는 동일한 자료형을 가지는 원소들로 이루어져 있으며, 다양한 데이터 타입을 지원합니다.

ndarr2 = np.array([1,2,3.14,4]) # 메모리 크기 : 실수 > 정수
ndarr3 = np.array([1,2,3.14,True]) # 메모리크기 : 실수> 정수 > 불린타입
ndarr4 = np.array(['1',2,3.14,True]) # 메모리 크기 : 문자열 > 실수 > 정수 > 불린타입
ndarr3 = np.array(['1',2,3.14,True],dtype=int) # 모든 요소를 int로 변경
# ndarr4 = np.array(['1',2,3.14,'True'],dtype=int) # True는 정수로 변경할 수 없는 문자열이므로 오류 발생
  • 이제 각 데이터의 출력 형태를 확인해 보겠습니다
  • 실수와 정수가 같이 존재할 때는 실수에 가중을 더 두기 때문에 데이터가 전부 실수형으로 출력됩니다
  • 실수, 정수, 불린이 같이 존재할 때는 실수 > 정수 > 불린 으로 가중을 두기 때문에 전부 실수로 나오게되고 불린은 0, 1로 출력이 됩니다
  • 문자열, 실수, 정수, 불린이 같이 존재할 때는 문자열 > 실수 > 정수 > 불린 으로 가중을 두고 전부다 문자열로 나오게 됩니다
  • 그리고 가중에 따르지 않고 원하고자 하는 타입으로 바꾸고 싶다면 dtype 조건에 원하는 타입 요소를 입력해 주면 됩니다

2-4. ndarray 인덱싱과 슬라이싱

더보기
넘파이의 ndarray는 리스트와 유사하게 인덱싱과 슬라이싱을 지원합니다.

2-5. Fancy Indexing

더보기

Fancy indexing은 넘파이에서 배열을 인덱싱하는 강력하고 유연한 방법 중 하나입니다. Fancy indexing은 정수 배열이나 불리언 배열을 사용하여 배열의 일부를 선택하는 방법을 말합니다. 이를 통해 여러 개의 요소를 한 번에 선택하거나 조건에 맞게 선택할 수 있습니다.

2-6. Boolean Indexing

더보기
Boolean Indexing은 넘파이에서 배열의 원소를 선택하는 강력하고 유용한 방법 중 하나입니다. 이 방법은 불리언(Boolean) 값으로 이루어진 배열을 사용하여 조건을 충족하는 원소만 선택하는 방식입니다.

3. 행렬 연산

더보기
넘파이에서는 다차원 배열인 ndarray를 사용하여 행렬 연산을 수행할 수 있습니다. 행렬 연산은 선형 대수와 관련이 깊어, 데이터 과학, 머신러닝, 통계 등 다양한 분야에서 사용됩니다.
a= np.array([[1,2,3],[2,3,4]])
b= np.array([[3,4,5],[1,2,3]])

# 덧셈
print(a+b)

# 뺄셈
print(a-b)

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

# 결과 : [[4 6 8] [3 5 7]] // [[-2 -2 -2] [ 1  1  1]] // [[ 3  8 15] [ 2  6 12]]
  • 리스트와 동일하게 배열의 인덱스 위치별로 계산이 되는걸 확인할 수 있습니다

4. 순차적인 값 생성

더보기
NumPy에서 np.arange() 함수는 일정한 간격으로 숫자들을 생성하는 데 사용됩니다. 이 함수는 Python의 기본 range() 함수와 유사하지만, NumPy 배열을 반환하므로 수학적인 연산이 가능합니다.
arr1 = range(1,11)
print(arr1)

for i in arr1:
    print(i,end=' ')
# 결과 : range(1, 11) // 1 2 3 4 5 6 7 8 9 10

arr2 = np.arange(1,11)
print(arr2)

for i in arr2:
    print(i, end=' ')
# 결과 : [ 1  2  3  4  5  6  7  8  9 10] // 1 2 3 4 5 6 7 8 9 10

5. 정렬

더보기
NumPy의 np.sort() 함수는 배열을 정렬하는 데 사용됩니다. 이 함수는 기본적으로 원래 배열을 변경하지 않고 정렬된 배열의 복사본을 반환합니다.