코딩공부/파이썬(Python)
Python_Numpy
diary100
2023. 6. 9. 17:40
1. 넘파이(Numpy)
- 수학, 과학 계산용 패키지
- 자료구조(ndarray)를 제공한다. 파이썬의 list 보다 속도가 빠름, 적은 메모리를 사용한다
1-1.Ndarray(하나의 자료구조)
●핵심 기능은 다차원 배열인 'ndarray'로, 동일한 타입의 요소들로 구성된 n차원의 배열(자료구조).
Python의 '리스트'와 비슷한 구조이나 빠른 속도, 적은 메모리의 사용, 연속적인 저장의 특징이 있음.
→ 데이터에 효율적인 접근과 연산을 가능케 함
list1 = [1,2,3,4]
list2 = [[1,2,3,4],[5,6,7,8]]
ndarr1 = np.array([1,2,3,4])
print(ndarr1)
print(type(ndarr1)) # ndarray = n dimension array
# 리스트를 ndarray 로 변환하는 방법
ndarr1 =np.array(list1)
ndarr2 =np.array(list2)
print(list1)
print(list2)
1-2.ndarray의 data type
●ndarray는 n dimension array의 약어로, 'n차원 배열'이라는 의미임.
리스트랑 달리 타입은 numpy.ndarry이다.
1-3 ndarray 슬라이싱
ndarr1 = np.array(['🍊','🥭','🍇','🐥','🍈','🍋'])
ndarr1
=========================================================
array(['🍊', '🥭', '🍇', '🐥', '🍈', '🍋'], dtype='<U1')
# shape -> ndarray 에 있는 데이터의 차원크기 반환
# 6행,1차원
ndarr1.shape
=========================================================
(6,)
#인덱싱
print(ndarr1[0])
print(ndarr1[1])
print(ndarr1[2])
print(ndarr1[3])
print(ndarr1[4])
=========================================================
🍊
🥭
🍇
🐥
🍈
#슬라이싱
print(ndarr1[0:3])
print(ndarr1[:5])
print(ndarr1[2:])
=========================================================
['🍊' '🥭' '🍇']
['🍊' '🥭' '🍇' '🐥' '🍈']
['🍇' '🐥' '🍈' '🍋']
1-4. Fancy 인덱싱
●범위가 아닌 특정 idnex의 집합의 값들을 선택해서 추출하고 싶을 떄 사용
ndarr1 =np.array([10,15,2,8,20,90,85,44,23,32])
idx = [2,5,9]
ndarr1[idx] #ndarr1[[2,5,9]]
========================================================
array([ 2, 90, 32])
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 값을 이용한 색인을 사용
ndarr1 = np.array(['🍊','🥭','🍇','🍓','🍈'])
selValue = [True,False,True,True,False]
ndarr1[selValue]
====================================================
array(['🍊', '🍇', '🍓'], dtype='<U1')
ndarr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
ndarr2d > 7
====================================================
array([[False, False, False, False],
[False, False, False, True],
[ True, True, True, True]])
ndarr2d[ndarr2d > 7]
====================================================
array([ 8, 9, 10, 11, 12])
2.행렬 연산
2-1.연산자
● 덧셈,뺄셈, 곱셈, 나눗셈은 shape가 같아야함
● 연산의 대한 결과는 같은 position 끼리 연산됨
● 내적은 맞닿는 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([[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))
np.dot(a,b)
=======================================
array([[22, 28],
[22, 28],
[31, 40]])
2-2.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
2-3.sort
ndarr1 = np.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])
# 문자열 역순으로 출력하기
str1 ='Python'
print(str1[:]) # 모든 문자 슬라이싱
print(str1[::]) # print(str1[::1]) => 1: 정방향
print(str1[::-1])
print(str1[4:1:-1]) # 4번 인덱스부터 1직전까지 역순으로 가져오기
print(str1[4::-1]) # 4번부터 역순으로 0까지 가져오기
=========================================
Python
Python
nohtyP
oht
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]])
#축의 마지막 방향 axis= -1
np.sort(ndarr2d, axis=-1)
=========================================
array([[ 9, 10, 11, 12],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8]])
2-4 숫자의 단일연산
a = np.array([[1,2,3],
[4,5,6]])
#덧셈
a+3
========================================
array([[4, 5, 6],
[7, 8, 9]])
#뺄셈
a-3
========================================
array([[-2, -1, 0],
[ 1, 2, 3]])
#나눗셈
a/3
========================================
array([[0.33333333, 0.66666667, 1. ],
[1.33333333, 1.66666667, 2. ]])
b =np.array([[3,3,3],
[3,3,3]])
a+b
========================================
array([[4, 5, 6],
[7, 8, 9]])