곰퓨타의 SW 이야기

[python] numpy 사용법 뿌시기 본문

TIL/코테개념_python

[python] numpy 사용법 뿌시기

곰퓨타 2021. 1. 1. 00:12

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를 딥러닝 수업에서 행렬 연산 같은 것을 처리하기 위해 사용하였는데, 열심히 활용해야겠다.⭐️😊

Comments