티스토리 뷰

넘파이의 사용

딥러닝을 구현시 배열과 행렬의 계산이 많이 등장하고 이때 넘파이의 배열 클래스인 numpy.array에서의 메서드들을 사용하면 편리함

+ 주로 C와 C++로 구현이 되어있기때문에 동적언어인 파이썬으로 구현됐을 때보다 처리 속도가 빠름.

 

1. 넘파이 배열 생성

import numpy as np 

=> np.array를 설정하고 다양한 메소드들을 적용시키며 사용할 수 있음

#넘파이 가져오기
import numpy as np
#넘파이는 파이썬의 동적언어로인한 속도가 늦다는 단점을 보완해줄 수도 있음. 정적언어인 C와 C++로 주로 구현됨.

#넘파이 배열 생성
x = np.array([1.0,2.0,3.0])
print(x,type(x))

=> [1. 2. 3.] <class 'numpy.ndarray'>

 

2. 넘파이의 연산

*넘파이의 연산

=> 원소의 수가 같을 때만 오류를 발생하지 않으며 연산이 이루어진다.

=> 각 원소별로 계산이 이루어지며 다른 원소에게는 +,-,*,/ 등의 연산이 영향을 주지 않는다.

=> 다만, 스칼라 연산일경우에는 브로드캐스트 기능이 적용되며 산술 연산이 이루어지며 이때 하나의 스칼라 값이 모든 원소에 영향을 미치는 것처럼 보이지만 실제로는 스칼라값이 행렬의 크기대로 추가되어 그 이후 각 원소별 연산이 이루어진다.

 

* 브로드캐스트란?

넘파이의 연산시 행렬과 스칼라의 연산이 가능하며 이때 스칼라값의 행렬이 확대되어 계산이 이루어진다.

=> 넘파이에서는 형상이 다른 배열끼리도 계산이 가능함.

 

x = np.array([1.0,2.0,3.0])
y = np.array([2.0,3.0,4.0])

print(x+y)
print(x-y)
print(x/y)
#여기서 주의할 점은 배열 x와 y의 원소수가 같아야함.

print(x/2.0)
#이때 스칼라 값과 넘파이 배열은 산술연산이 가능하며 이를 "브로드캐스트"라고 함.
#브로드캐스트 : 스칼라값이 행렬의 크기에 맞춰서 확대된 후 연산이 이루어지고 이때의 기능을 브로드캐스트라고함.

A = np.array([[1,2],[3,4]])
print(A)
print(A.shape)
#shape를 통한 행렬의 형상(차원의 크기)를 알 수 있음.
print(A.dtype)
#dtype을 통해 행렬 원소의 데이터 타입을 알 수 있음.

B = np.array([[3,0],[0,6]])
print(A+B)
print(A*B)
#배열과 마찬가지로 np.array 역시 행렬과 스칼라값의 산술연산이 가능함.

실행결과

3. 넘파이 배열의 원소 접근

선언한 np.array의 이름을 X라고 할 때,

* 평탄화시키는 방법 -> 차원을 줄일 수 있음

X.flatten( )을 통해서 1차원 배열 X로 바꿔줌

* 인덱싱방법 => X = X[~인덱싱할조건~]

X = X[np.array([인덱싱할 원소의번호들])]을 통해서 인덱싱하고 싶은 원소의 번호에 있던 값들만 X에 초기화됨

X = X[X>15]처럼 X[~~~]를 활용해서 인덱싱이 가능함

X = np.array([[51,55],[14,9],[0,4]])
print(X)

print(X[0])
print(X[0][1])
#배열을 사용할 때와 마찬가지로 np.array의 원소 접근이 다음과 같이 이루어짐.

#추가개념 -> flatten()
X = X.flatten()
print(X)
#추가개념 -> np.array이름[np.array([인덱싱할 번호])]
print(X[np.array([0,2,4])])
#추가개념 -> np.array를 통해 정의한 X벡터가 있을 때 부드호(>,<)를 통해서 인텍싱할 수 있음
print(X>15)
print(X[X>15])