일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Object detection
- 전산기초
- docker
- SWEA
- 파이썬
- 3단계
- ubuntu
- ssd
- CS231n
- pytorch
- 머신러닝
- AWS
- STL
- 구현
- 프로그래머스
- 1단계
- cs
- Python
- 백준
- 자료구조 및 실습
- test-helper
- 코드수행
- 모두를 위한 딥러닝 강좌 시즌1
- 딥러닝
- MySQL
- 이것이 코딩테스트다 with 파이썬
- C++
- 실전알고리즘
- 그리디
- 2단계
- Today
- Total
곰퓨타의 SW 이야기
[python] numpy 사용법 뿌시기 본문
numpy가 앞으로 유용하게 사용될 것 같아서 numpy에 대해 찾아보았다.
numpy에 대한 정보는 다음과 같은 사이트를 참고하였다.
aikorea.org/cs231n/python-numpy-tutorial/#numpy
Python Numpy Tutorial
이 튜토리얼은 Justin Johnson 에 의해 작성되었습니다. cs231n 수업의 모든 과제에서는 프로그래밍 언어로 파이썬을 사용할 것입니다. 파이썬은 그 자체만으로도 훌륭한 범용 프로그래밍 언어이지만
aikorea.org
(정리가 굉장히 잘되있어서 뭔가 앞으로도 유용하게 쓸 수 있는 사이트인 것 같다👀)
Numpy??
Numpy는 고성능의 다차원 배열 객체와 이를 다룰 도구를 제공한다.
Numpy 는 배열형태로 이용하고 여러 가지 함수를 제공해주는 것 같다!
배열
Numpy배열은 동일한 자료형을 가지는 값들이 격자판 형태로 있다. rank는 배열이 몇차원인지, shape는 차원의 크기를 알려준다.
리스트를 중첩하여 numpy 배열을 초기화할 수 있고 대괄호를 통해 각 요소에 접근할 수 있다.
배열 생성1
import numpy as np
a = np.array([1,2,3]) # rank가 1인 (1차원) 배열 생성
print type(a) # "<type 'numpy.ndarray'>"
print a.shape # "(3,)"
a[0] = 5
print a # "[5,2,3]"
b= np.array([[1,2,3],[4,5,6]]) # rank가 2인 (2차원) 배열 생성
print b.shape # "(2,3)"
print b[0,0], b[0,1], b[1,0] # "1 2 4"
배열 생성2
import numpy as np
a = np.zeros((2,2)) # 모든 값이 0인 2x2 배열 생성
print a # "[[0. 0.],
#[0. 0.]]"
b = np.ones((1,2)) # 모든 값이 1인 배열 생성
print b # "[[1. 1.]]"
c = np.full((2,2),7) # 모든 값이 특정 상수인 배열 생성
print c # "[[7. 7.],[7. 7.]]"
d = np.eye(2) # 2x2 단위 행렬 생성
print d # "[[1. 0.]
#[0. 1.]]"
e = np.random.random((2,2)) # 임의의 값으로 구성된 배열 생성
print e # [[0.9 0.8], [0.6, 0.2]]
배열 인덱싱
1) 슬라이싱 : 파이썬 리스트와 유사하지만 Numpy 배열은 다차원인 경우가 많으므로, 각 차원 별로 어떻게 슬라이스할지 명시해야 한다.
import numpy as np
# rank가 2이고 shape는 (3,4)인 배열
# [[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8],[9,10,11,12]])
# 슬라이싱으로 첫 두행과 1,2열로 이루어지진 배열 만들기 (shape : (2,2))
# [[2 3]
# [6 7]]
b = a[:2, 1:3]
# 슬라이싱 된 배열은 원본 배열과 같은 데이터를 참조하므로, 슬라이싱 된 배열을 수정하면 원본 배열도 수정된다.
print a[0,1] # "2"
b[0,0] = 77 # b[0,0] === a[0,1]
print a[0,1] # "77"
배열의 중간행 접근
import numpy as np
# rank가 2이고 shape가 (3,4)인 배열을 생성
# [[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
# 배열의 중간 행에 접근하는 첫 번째 방법
# 정수 인덱싱과 슬라이싱을 혼합해서 사용하면 낮은 rank(차원)의 배열이 생성되지만
# 슬라이싱만 사용하면 원본 배열과 동일한 rank의 배열이 생성된다.
row_r1 = a[1, :] # 배열a의 두 번째 행을 rank가 1인 배열로
row_r2 = a[1:2, :] # 배열a의 두 번째 행을 rank가 2인 배열로
print row_r1, row_r1.shape # 출력 "[5 6 7 8] (4,)"
print row_r2, row_r2.shape # 출력 "[[5 6 7 8]] (1, 4)"
# 열의 경우
col_r1 = a[:,1]
col_r2 = a[:,1:2]
print col_r1, col_r1.shape # "[2 6 10] (3, "
print col_r2, col_r2.shape # "[[2] [6] [10]] (3,1)"
정수 배열 인덱싱
numpy 배열을 슬라이싱하면, 결과로 얻어지는 배열은 언제나 원본 배열의 부분 배열이다. 정수 배열 인덱싱의 경우,
원본과 다른 배열 생성이 가능하다.
import numpy as np
a = np.array([[1,2], [3, 4], [5, 6]])
# 정수 배열 인덱싱
# 반환되는 배열의 shape는 (3,)
print a[[0, 1, 2], [0, 1, 0]] # 출력 "[1 4 5]" 0번째 열에서-0번째 index , 1-1, 2-0 뜻인가봄..
# 위에서 본 정수 배열 인덱싱 예제는 다음과 동일하다:
print np.array([a[0, 0], a[1, 1], a[2, 0]]) # 출력 "[1 4 5]"
# 정수 배열 인덱싱을 사용할 때,
# 원본 배열의 같은 요소를 재사용가능:
print a[[0, 0], [1, 1]] # 출력 "[2 2]"
# 위 예제는 다음과 동일하다.
print np.array([a[0, 1], a[0, 1]]) # 출력 "[2 2]"
정수배열 인덱싱 유용하게 사용하는 방법
import numpy as np
# 새로운 배열 생성
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
print a # 출력 "array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])"
# 인덱스를 저장할 배열 생성
b = np.array([0, 2, 0, 1])
# b에 저장된 인덱스를 이용해 각 행에서 하나의 요소를 선택
print a[np.arange(4), b] # 출력 "[ 1 6 7 11]"
# b에 저장된 인덱스를 이용해 각 행에서 하나의 요소를 변경
a[np.arange(4), b] += 10
print a # 출력 "array([[11, 2, 3],
# [ 4, 5, 16],
# [17, 8, 9],
# [10, 21, 12]])
불리언 배열 인덱싱
특정 조건을 만족하는 요소만 선택할 수 있도록 한다.
import numpy as np
a = np.array([[1,2], [3, 4], [5, 6]])
bool_idx = (a > 2) # 2보다 큰 a의 요소를 찾는다.
# 이 코드는 a와 shape가 같고 불리언 자료형을 요소로 하는 numpy 배열을 반환
# bool_idx의 각 요소는 동일한 위치에 있는 a의 요소가 2보다 큰지를 말해준다.
print bool_idx # 출력 "[[False False]
# [ True True]
# [ True True]]"
# 불리언 배열 인덱싱을 통해 bool_idx에서 참 값을 가지는 요소로 구성되는
# rank 1인 배열을 구성하기
print a[bool_idx] # 출력 "[3 4 5 6]"
# 한 문장으로 조건에 만족하는 것만 배열로 만들기~!
print a[a > 2] # 출력 "[3 4 5 6]"
배열 연산
import numpy as np
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
# 요소별 합; 둘 다 다음의 배열을 만든다.
# [[ 6.0 8.0]
# [10.0 12.0]]
print x + y
print np.add(x, y)
# 요소별 차; 둘 다 다음의 배열을 만든다.
# [[-4.0 -4.0]
# [-4.0 -4.0]]
print x - y
print np.subtract(x, y)
# 요소별 곱; 둘 다 다음의 배열을 만든다.
# [[ 5.0 12.0]
# [21.0 32.0]]
print x * y
print np.multiply(x, y)
# 요소별 나눗셈; 둘 다 다음의 배열을 만든다.
# [[ 0.2 0.33333333]
# [ 0.42857143 0.5 ]]
print x / y
print np.divide(x, y)
# 요소별 제곱근; 다음의 배열을 만든다.
# [[ 1. 1.41421356]
# [ 1.73205081 2. ]]
print np.sqrt(x)
sum
import numpy as np
x = np.array([[1,2],[3,4]])
print np.sum(x) # 모든 요소를 합한 값을 연산; 출력 "10"
print np.sum(x, axis=0) # 각 '열'에 대한 합을 연산; 출력 "[4 6]"
print np.sum(x, axis=1) # 각 '행'에 대한 합을 연산; 출력 "[3 7]"
행렬 모양을 바꾸어 연산을 해야하는 경우
import numpy as np
x = np.array([[1,2], [3,4]])
print x # 출력 "[[1 2]
# [3 4]]"
print x.T # 출력 "[[1 3]
# [2 4]]"
# rank 1인 배열을 전치할 경우 아무 일도 일어나지 않는다~!
v = np.array([1,2,3])
print v # 출력 "[1 2 3]"
print v.T # 출력 "[1 2 3]"
numpy를 딥러닝 수업에서 행렬 연산 같은 것을 처리하기 위해 사용하였는데, 열심히 활용해야겠다.⭐️😊
'TIL > 코테개념_python' 카테고리의 다른 글
[python] 진수변환 뿌시기 🔥 (0) | 2021.01.03 |
---|---|
[python] 문자열 함수 뿌시기 🔥 (0) | 2021.01.03 |
[python] zip을 이러한 방법으로 활용한다구 ?? (0) | 2020.12.30 |
[python] 순열과 조합을 모듈로?? (0) | 2020.12.28 |
[python] heapq 모듈 부시기❗️ (0) | 2020.12.28 |