목차
- 1. Numpy
- 1-1. ndarray 다차원 배열
- 1-2. ndarray 의 datatype
- 1-3. ndarray 의 슬라이싱
- 1-4. Fancy 인덱싱
- 1-5. Boolean 인덱싱
1. NumPy:
NumPy는 Python에서 수치 연산을 수행하기 위한 핵심 라이브러리다. 고성능의 다차원 배열 객체, 그리고 이 배열을 다루기 위한 다양한 함수와 도구를 제공한다. 파이썬의 list보다 속도가 빠르고, 적은 메모리를 사용한다.
NumPy는 데이터 분석, 과학적 컴퓨팅 및 기계 학습과 같은 많은 분야에서 널리 사용된다.
Numpy 설치하고 기능을 사용하기 위해 받아오기
# 설치하기
!pip install numpy
# import 하기
import numpy
np라는 약자로 numpy를 import 해오면 Numpy라이브러리를 쉽게 호출해 사용할 수 있다. np는 Numpy에 대한 약어다!
(import는 한번만 하면 되는데 나는 import numpy as np 구문을 사용할거임)
# import 하기 2
import numpy as np
1-1. ndarray (다차원 배열):
NumPy의 `ndarray`는 NumPy의 핵심 개체이다. `ndarray`는 동일한 유형의 원소로 구성된 n차원 배열을 나타낸다. 이 배열은 메모리 상에 연속적으로 배치되어 있어 요소에 대한 효율적인 접근과 다차원 데이터의 표현과 조작이 가능하다. `ndarray`는 다양한 모양(shape)과 차원(dimension)을 가질 수 있으며, 배열의 크기 및 모양은 수정 가능하다.
# ndarry = n dimention array
▼다차원 배열 예시: list2
list1 = [1,2,3,4]
list2 = [[1,2,3,4], [5,6,7,8]]
print(list1) #[1, 2, 3, 4]
print(list2) #[[1, 2, 3, 4], [5, 6, 7, 8]]
print(type(list1)) #<class 'list'>
print(type(list1[1])) #<class 'int'>
print(type(list2)) #<class 'list'>
▼Numpy를 사용하여 1차원 배열(ndarr1)을 생성하고, 배열의 내용과 데이터 타입을 출력하는 예제
ndarr1 = np.array([1,2,3,4])
print(ndarr1) #[1 2 3 4]
print(type(ndarr1)) #<class 'numpy.ndarray'>
np.array([1,2,3,4]): Numpy의 array함수를 사용하여 [1,2,3,4]라는 리스트를 Numpy배열로 변환한다.
이렇게 생성된 배열은 ndarr1 변수에 할당된다.
# 리스트를 ndarray로 변환하는 방법
ndarr1= np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1) #[1 2 3 4]
print(ndarr2) #[[1 2 3 4], [5 6 7 8]]
print(type(ndarr1)) #<class 'numpy.ndarray'>
print(type(ndarr2)) #<class 'numpy.ndarray'>
1-2. ndarray의 데이터 유형(datatype):
`ndarray`는 다양한 데이터 유형을 지원한다. 배열의 원소는 정수, 부동 소수점, 복소수, 불리언 값 등이 될 수 있다. 그러나 ndarray는 list 와 다르게 한 리스트에 1개의 단일 데이터 타입만 허용한다.
데이터 유형은 `dtype` 속성을 통해 확인하고 설정할 수 있으며, 배열이 소비하는 메모리의 양과 배열에 적용되는 연산의 종류에 영향을 준다.
▼list
list1= [1, 3.14, 'Python', '✨💖', True]
# list의 경우 다양한 타입이 저장됨
list1 #[1, 3.14, 'Python', '✨💖', True]
# 출력시에도 그대로 다양한 타입이 출력됨
list1[3] # '✨💖'
▼ndarray
ndarr1 = np.array([1,2,3,4])
ndarr1 #array([1, 2, 3, 4])
# int와 float 두가지 타입을 넣었을 경우
ndarr2 = np.array([1,2,3.14, 4])
ndarr2 #array([1. , 2. , 3.14, 4. ])
# 모든 요소가 다 float화 되어있음!!
# int와 float, 그리고 Boolean 타입을 넣었을 경우
ndarr3 = np.array([[1,2,3.14, True]])
ndarr3 # array([[1. , 2. , 3.14, 1. ]])
# 역시 모든 요소가 float화! 세가지 타입 중 가장 큰 요소값에 맞춤
# int와 float, Boolean, 그리고 string타입을 넣었을 경우
ndarr4 = np.array(['1',2,3.14,True])
ndarr4 #array(['1', '2', '3.14', 'True'], dtype='<U32')
# 여기서는 string형이 가장 크기가 크기 때문에 전부 string형으로 바뀜
# 전체 타입을 int로 변경
ndarr4=np.array(['1',2,3.14, True], dtype=int)
ndarr4 #array([1, 2, 3, 1])
# 따옴표를 떼고 int면 숫자형으로 변환 가능!
ndarr4=np.array(['1','2','3.14', 'True'], dtype=int)
# 따옴표를 뗀 형태가 int가 아닌 요소들이 포함되어있기 때문에 타입변환 불가. 에러가 남!
1-3. ndarray 슬라이싱:
NumPy 배열은 슬라이싱을 통해 배열의 일부분에 접근하고 조작할 수 있다. 슬라이싱은 배열의 원소에 접근하는 효율적인 방법으로, 배열의 일부분을 선택하거나 변경할 수 있다. 슬라이싱은 인덱스를 사용하여 배열의 원소 범위를 지정하고 조작할 수 있다.
ndarr1 = np.array(['🍓', '🍒','🍋', '🍉', '🍎'])
ndarr1 # array(['🍓', '🍒', '🍋', '🍉', '🍎'], dtype='<U1')
# 모양 찍어보기
ndarr1.shape
# (5,)
결과가 (5,) 로 나옴. 1차원 데이터에 5개의 요소가 들어있다는 의미!
# 인덱싱
print(ndarr1[0])
print(ndarr1[3])
print(ndarr1[-1])
#🍓
#🍉
#🍎
# 슬라이싱
print(ndarr1[0: 3])
print(ndarr1[2: ])
print(ndarr1[ :3])
#['🍓' '🍒' '🍋']
#['🍋' '🍉' '🍎']
#['🍓' '🍒' '🍋']
# 2차원 배열 만들고 모양 찍어보기
ndarr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
ndarr2d.shape #(3, 4)
결과가 (3, 4)로 나옴. 2차원 배열이며 3행 4열임을 알 수 있다.
# 2차원 배열 인덱싱
print(ndarr2d[0, 2])
print(ndarr2d[[0],[2]])
#3
#[3]
대괄호가 왜 있나 둘의 차이가 궁금하쥬?
- 첫번째 출력문인 print(ndarr2d[0, 2])에서는 ndarr2d의 0번째 행과 2번째 열에 위치한 원소를 출력하고 있다. 인덱싱은 0부터시작하기 때문에 ndarray 의 0번째 행은 [1, 2, 3, 4, ] 이고, 2번째열은 3이므로 3이 출력된다!
- 두번째 출력문인 print(nadrr2d[0],[2]) 에서는 ndarr2d의 0번째 행과 2번째 열에 해당하는 원소를 출력하고 있다. Numpy에서 대괄호를 사용하여 인덱스를 지정하면 해당 위치에있는원소를반환한다. 여기서는 0번째 행에 2번째열을 선택하는것은 같지만 선택된 원소를 1차원 배열 형태로 반환하기 때문에 [3]의 모양으로 출력되는것이다!
요약하자면 print(ndarr2d[0, 2])은 2차원 배열에서 원소하나를 선택하여 출력하는 것이고, print(nadrr2d[0],[2]) 에서는 해당 위치의 원소를 1차원 배열로 반환하는 것이다.
# 0번째 행 가져오기
print(ndarr2d[0])
print(ndarr2d[0,])
print(ndarr2d[0, :]) # : 이 전체를 가져오라는 뜻
# 셋 다 결과가 [1 2 3 4]로 같게 나옴
# 0번째 열 가져오기
print(ndarr2d[: ,0])
print(ndarr2d[2 ,0])
# [1 5 9]
# 9
첫번째 출력문은 (행 전체에서, 0번째 열) 을 가져와라 라는 뜻
두번째 출력문은 (2번째 행에서. 0번째열)을 가져와라 라는 뜻
1-4. Fancy 인덱싱:
Fancy 인덱싱은 NumPy 배열의 특정 위치에 접근하고 조작하기 위한 고급 인덱싱 방법이다. Fancy 인덱싱은 정수 배열 또는 불리언 배열을 사용하여 배열의 원소를 선택하거나 재정렬할 수 있다. 이를 통해 배열의 원소에 대한 복잡한 조작을 수행할 수 있다.
범위가 아니라 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 사용한다!
# 먼저 1차원 배열 하나 만들어주기
ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32]
# 그다음 인덱스 배열 만들어주기
idx = [2, 5, 9 ]
# ndarr1 배열에서 idx리스트에 포함된 인덱스들에 해하는 원소 선택하기
ndarr1[idx]
# array([ 2, 90, 32])
# 이번에는 2차원 배열 만들어주기
ndarr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
# 0행과 1행 만 전부 가져오기
ndarr2d[[0,1], :]
# array([[1, 2, 3, 4],
# [5, 6, 7, 8]])
1-5. Boolean 인덱싱:
Boolean 인덱싱은 조건에 따라 배열의 원소를 선택하는 방법이다. 조건에 대한 평가 결과가 True인 위치에 해당하는 원소를 선택하거나 조작할 수 있다. 이를 통해 특정 조건을 만족하는 배열의 원소를 필터링하거나 조작할 수 있다. Boolean 인덱싱은 데이터 필터링과 마스킹 작업에 유용하다!
# 배열과 리스트 만들기
ndarr1 = np.array(['🍓', '🍒','🍋', '🍉', '🍎'])
selValue = [True, False, True, True, False]
위의 selValue리스트는 불리언값으로 이루어진 리스트로, ndarr1배열에서 선택할 원소를지정하는 마스크 역할을 한다.
True 에 해당하는 인덱스의 원소는 선택되고, False에 해당하는 인덱스의 원소는 선택되지 않는다.
# ndarr1배열에서 selValue리스트에 대응하는 원소들을 선택한다. (True에 해당하는 인덱스에 있는 원소들을 선택)
ndarr1[selValue]
# array(['🍓', '🍋', '🍉'], dtype='<U1')
리스트 길이가 안맞는 경우에는 에러가 뜨니까 배열 길이와 리스트 길이를 맞춰야함!
# 2차원 배열 만들기
ndarr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
ndarr2d.shape
# (3, 4)
3행 4열임을 알 수 있다
ndarr2d > 7
#array([[False, False, False, False],
# [False, False, False, True],
# [ True, True, True, True]])
ndarr2d배열의 요소 중 7보다 큰것을 출력하면, 7보다 큰 요소만 나오는 것이 아니라 boolean타입의 배열이 나온다.
만약 boolean타입 배열이 아니라 7보다 큰 요소들만 뽑아서 보고싶다면 아래와 같이 하면 된다.
ndarr2d[ndarr2d > 7]
# array([ 8, 9, 10, 11, 12])
'KDT 수업 > Python' 카테고리의 다른 글
[데이터분석] Pandas 판다스-1 (2) | 2023.06.09 |
---|---|
[데이터분석] 행렬연산 (0) | 2023.06.08 |
28. DB를 이용한 단어장 만들기 (0) | 2023.03.22 |
27. 파이썬과 MySQL 연동 (0) | 2023.03.22 |
26. DAO, DTO, VO (0) | 2023.03.22 |