넘파이(Numpy)
- 수학, 과학 계산용 패키지
- 자료구조(ndarray)를 제공 -> 파이썬의 list보다 속도가 빠름, 적은 메모리를 사용
numpy 설치
!pip install numpy
numpy import
import numpy
numpy 라이브러리 위치
print(numpy)
ndarray
- NumPy의 자료구조 클래스
- "n-차원 배열"을 의미함
- 벡터, 행렬 또는 고차원 텐서와 같은 모든 차원의 배열을 나타내고 연산을 수행하는 방법을 제공함
- list
list1 = [1, 2, 3, 4]
list2 = [[1,2,3,4], [5,6,7,8]]
# list1 출력
print(list1) # [1, 2, 3, 4]
# list2 출력
print(list2) # [[1, 2, 3, 4], [5, 6, 7, 8]]
# list1의 타입 출력
print(type(list1)) # <class 'list'>
# list1의 인덱스 0 의 요소 출력
print(type(list1[0])) # <class 'int'>
# list2의 타입 출력
print(type(list2)) # <class 'list'>
- ndarray 선언
import numpy as np
ndarray명 = np.array([값1, 값2, ...])
- ndarray 출력
ndarr1 = np.array([1,2,3,4])
# ndarr1 출력
print(ndarr1) # [1 2 3 4]
# ndarr1의 타입 출력
print(type(ndarr1)) # ndarray = n dimension array
- 리스트를 ndarray로 변환하는 방법
list1 = [1, 2, 3, 4]
list2 = [[1,2,3,4], [5,6,7,8]]
# list1를 ndarray로 변환
ndarr1 = np.array(list1)
# list2를 ndarray로 변환
ndarr2 = np.array(list2)
# ndarr1 출력
print(ndarr1) # [1 2 3 4]
# ndarr2 출력
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'>
ndarray의 data type
- ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용
list1 = [1, 3.14, "python", "😎", True]
print(list1) # [1, 3.14, 'python', '😎', True]
print(list1[3]) # 😎
ndarr1 = np.array([1,2,3,4])
print(ndarr1) # array([1, 2, 3, 4])
ndarr2 = np.array([1,2,3.14,4]) # 모든 요소가 float로 변경됨
print(ndarr2) # array([1. , 2. , 3.14, 4. ])
ndarr3 = np.array([1,2,3.14, True]) # 모든 요소가 float로 변경됨
print(ndarr3) # array([1. , 2. , 3.14, 1. ])
ndarr4 = np.array(["1",2,3.14, True]) # 모든 요소가 string로 변경됨
print(ndarr4) # dtype='<U32' 유니코드 데이터 타입
# array(['1', '2', '3.14', 'True'], dtype='<U32')
print(type(ndarr4)) # numpy.ndarray
data type 설정하기
ndarr3 = np.array([1,2,3.14, True], dtype=int) # datatype을 int로 설정
print(ndarr3) # array([1, 2, 3, 1])
ndarr4 = np.array(["1",2,3.14, True], dtype=int) # datatype을 int로 설정
print(ndarr4) # array([1, 2, 3, 1])
ndarr5 = np.array(["1",2,"3.14", True], dtype=int) # 3.14를 바꾸지 못하기 때문에 ValueError
ndarray 슬라이싱
ndarr1 = np.array(['🍒','🍑','🍐','🍏'])
ndarr1 # array(['🍒', '🍑', '🍐', '🍏'], dtype='<U1')
# shape : ndarray에 저장되어있는 행렬을 보여줌
ndarr1.shape # (4,)
# 인덱싱
print(ndarr1[0]) # 🍒
print(ndarr1[3]) # 🍏
print(ndarr1[-1]) # 🍏
print(ndarr1[-2]) # 🍐
# 슬라이싱
print(ndarr1[0:3]) # ['🍒' '🍑' '🍐']
print(ndarr1[1:]) # ['🍑' '🍐' '🍏']
print(ndarr1[:3]) # ['🍒' '🍑' '🍐']
2차원 ndarray 슬라이싱
ndarr2d = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
ndarr2d.shape # (3, 4) 3행 4열
print(ndarr2d[0,2]) # 3
print(ndarr2d[0][2]) # 3
# 0행 가져오기
print(ndarr2d[0]) # [1 2 3 4] 자주 사용하는 방법
print(ndarr2d[0,]) # [1 2 3 4]
print(ndarr2d[0,:]) # [1 2 3 4] 자주 사용하는 방법
# 0열 가져오기
# 앞의 행은 다 가져오고 , 0열을 가져옴
print(ndarr2d[:,0]) # [1 5 9]
Fancy 인덱싱
- 범위가 아닌 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 활용
ndarr1 = np.array([10,15,2,8,20,90,85,44,23,32])
idx = [2, 5, 9]
# 인덱스의 넣는 숫자
ndarr1[idx] # array([ 2, 90, 32])
ndarr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
ndarr2d[[0,1],:]
'''
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
'''
Boolean 인덱싱
- 조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용
ndarr1 = np.array(['🍒','🍑','🍐','🍏','🍕'])
selValue = [True, False, True, True, False]
# 중요! True인것만 뽑힘
ndarr1[selValue] # array(['🍒', '🍐', '🍏'], dtype='<U1')
selValue = [True, False, True]
ndarr1[selValue] # 숫자가 맞지 않기 때문에 IndexError 발생!
ndarr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
ndarr2d > 7 #boolean화가 되어 7보다 큰 값들만 True로 표현
'''
array([[False, False, False, False],
[False, False, False, True],
[ True, True, True, True]])
'''
# 7보다 큰 값들만 뽑기
ndarr2d[ndarr2d > 7] # array([ 8, 9, 10, 11, 12])
행렬 연산
연산자
- 덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야 함
- 같은 postition끼리 연산
- 내적(dot product)은 맞닿는 shape가 같아야 함
- 내적은 떨어져 있는 shape가 결과 행렬이 됨
a = np.array([[1,2,3],
[2,3,4]])
b = np.array([[3,4,5],
[1,2,3]])
a.shape, b.shape # ((2, 3), (2, 3))
# 덧셈연산
a + b
# array([[4, 6, 8],
# [3, 5, 7]])
# 뺄셈 연산
a - b
'''
array([[-2, -2, -2],
[ 1, 1, 1]])
'''
# 곱셈 연산
a * b
'''
array([[ 3, 8, 15],
[ 2, 6, 12]])
'''
# 나눗셈 연산
a / b
'''
array([[0.33333333, 0.5 , 0.6 ],
[2. , 1.5 , 1.33333333]])
'''
dot product(행렬곱, 내적)
- 영상관련 딥러닝할때 많이 쓰임
a = np.array([[1,2,3],
[1,2,3],
[2,3,4]])
b = np.array([[1,2],
[3,4],
[5,6]])
a.shape, b.shape # ((3, 3), (3, 2))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6)) # 22 28
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6)) # 22 28
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6)) # 31 40
np.dot(a,b)
'''
array([[22, 28],
[22, 28],
[31, 40]])
'''
arange
- 순차적인 값을 생성할 때 사용
arr1 = range(1, 11)
arr1 # range(1, 11)
for i in arr1:
print(i, end=' ')
# 1 2 3 4 5 6 7 8 9 10
arr2 = np.arange(1,11)
arr2 # array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
for i in arr2:
print(i, end=' ')
# 1 2 3 4 5 6 7 8 9 10
sort
ndarr1 = np.array([1,10,5,7,2,4,3,6,8,9])
ndarr1 # array([ 1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
np.sort(ndarr1) # array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
ndarr1 # array([ 1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
np.sort(ndarr1, reverse=True) # reverse 속성이 없기 때문에 에러!
# 문자열 역순으로 출력하기
str1 = 'Python'
# 모든 문자를 슬라이싱
print(str1[:]) # Python
# print(str1[::1]) -> 1: 정방향
print(str1[::]) # Python
# print(str1[::-1]) -> -1 :역방향
print(str1[::-1]) # nohtyP
# 4번 인덱스부터 1직전까지 역순으로 가져오기
print(str1[4:1:-1]) # oht
# 4번 인덱스부터 0까지 역순으로 가져오기
print(str1[4::-1]) # ohtyP
# 내림차순 정렬
np.sort(ndarr1)[::-1] # array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
ndarr2d = np.array([[11,10,12,9],
[3,1,4,2],
[5,6,7,8]])
# ndarr2d.shape #(3, 4)
# 행 정렬(axis=0)
np.sort(ndarr2d, axis=0)
'''
array([[ 3, 1, 4, 2],
[ 5, 6, 7, 8],
[11, 10, 12, 9]])
'''
# 열 정렬(axis=1)
np.sort(ndarr2d, axis=1)
'''
array([[ 9, 10, 11, 12],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8]])
'''
# 행 내림차순 정렬
np.sort(ndarr2d, axis=1)[:,::-1]
'''
array([[12, 11, 10, 9],
[ 4, 3, 2, 1],
[ 8, 7, 6, 5]])
'''
# 축의 마지막 방향
np.sort(ndarr2d, axis=-1)
'''
array([[ 9, 10, 11, 12],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8]])
'''
숫자의 단일 연산
a = np.array([[1,2,3],
[4,5,6]])
# 모든 요소에 3을 더함
a+3
'''
array([[4, 5, 6],
[7, 8, 9]])
'''
# 모든 요소에 3을 뺌
a-3
```
array([[-2, -1, 0],
[ 1, 2, 3]])
```
# 모든 요소에 3을 곱함
a*3
'''
array([[ 3, 6, 9],
[12, 15, 18]])
'''
# 모든 요소에 3을 나눔
a/3
'''
array([[0.33333333, 0.66666667, 1. ],
[1.33333333, 1.66666667, 2. ]])
'''
b = np.array([[3,3,3],
[3,3,3]])
# ndarray끼리 덧셈
a+b
'''
array([[4, 5, 6],
[7, 8, 9]])
'''
'데이터 분석' 카테고리의 다른 글
2-4. 결측값(Null, NaN) (0) | 2023.06.08 |
---|---|
2-3. 데이터 다루기 (0) | 2023.06.08 |
2-2. 데이터 프레임의 기본 정보 (0) | 2023.06.01 |
2-1. CSV 파일 다루기 (0) | 2023.05.31 |
2. Pandas(판다스) (0) | 2023.05.29 |