본문 바로가기

Programming/Python

Numpy 튜토리얼

반응형

numpy 특징

  • Numerical Python
  • 강력한 다차원 배열과 행렬 연산
  • 다양한 선형 대수학 함수와 난수
  • 간결한 코딩

for문과 numpy 비교

# 두 개의 리스트에 난수(random number)를 저장
import numpy as np
n = 100000
w = [np.random.random() for _ in range(n)]
x = [np.random.random() for _ in range(n)]

# list의 값을 np 배열로 복사
wnum = np.array(w) # ndarray type
xnum = np.array(x)

 

%%time
total = 0
for i in range(n):
    total += w[i]*x[i]
    print(total)

 

 

 

%%time
total = np.dot(wnum, xnum)
print(total)

코드가 훨씬 간결해졌을 뿐만 아니라, 속도가 엄청 빠르다.


numpy 배열의 속성

ndarray(넘파이 클래스) 속성

  • ndim : 차원, axis 개수, rank
  • shape : 형상, 각 차원의 배열의 크기
  • size : 배열의 모든 원소의 개수
  • dtype : 원소의 자료 형식

코딩을 할 때 이러한 변수의 속성과 타입을 알고 있으면, 디버깅을 할 때 매우 수월하게 작업할 수 있다.

 

아래와 같은 funtion을 만들어 사용할 수도 있다.

 

# 배열의 속성 출력 함수
def pprint(arr):
    print("type:{}, size:{}".format(type(arr),arr.size))
    print("shape:{},ndim/rank:{},dtype{}".
          format(arr.shape, arr.ndim, arr.dtype))
    print("Array's Data:")
    print(arr)

배열의 생성

  • np.array() - 리스트, 튜플 이용
  • 배열 생성 함수

리스트 튜플 사용

a = np.array([1,2,3,4]) # list
a = np.array((1,2,3,4)) # tuple
a = np.array(1,2,3,4) # wrong

 

배열 생성 함수 사용

a = np.arange(12)
pprint(a) # 배열의 속성 함수 사용 예시

a = np.arange(12, dtype=float).reshape(3, 4)
pprint(a)

이렇게 shape와 dtype도 바꿀 수 있다.

 

아래와 같은 함수도 있다.

full : 사용자가 지정한 하나의 값으로 배열을 생성

 

 

empty : 임의의 값으로

 

eye : 단위 행렬 생성

 

 

데이터 생성 함수

 

np.arange

# start부터 Stop미만까지 step간격으로 데이터를 생성
# arrange([start,] stop[,step,], dtype=None)
np.arange(0, 100, 3, dtype=float)

import matplotlib.pyplot as plt
%matplotlib inline

a = np.arange(0, 100, 6, dtype=float)
plt.plot(a, 'or')
plt.show()

 

np.linspace

# num 개수 만큼 균일한 간격으로 추출
# endpoint : end값을 포함할 지 여부 (default는 True)
# retstep : 배열의 간격 출력 (default= False)
np.linspace(0, 100, num=20, endpoint=True, retstep=True)
>>> (array([  0.        ,   5.26315789,  10.52631579,  15.78947368,
         21.05263158,  26.31578947,  31.57894737,  36.84210526,
         42.10526316,  47.36842105,  52.63157895,  57.89473684,
         63.15789474,  68.42105263,  73.68421053,  78.94736842,
         84.21052632,  89.47368421,  94.73684211, 100.        ]),
 5.2631578947368425)
import matplotlib.pyplot as plt
%matplotlib inline

x = np.linspace(0, 2*np.pi)
y = np.sin(x)
plt.plot(x, y)
plt.show()

 

logspace

# logspace는 start부터 stop의 범위에서 로그 스케일로 num 개의 데이터를 생성
# 이 경우, 30개의 점과 출력범위 3^1(3) ~ 3^5(243)
a = np.logspace(1, 5, num=30, endpoint=True, base = 3.0, dtype=float)
plt.plot(a, 'xb')
plt.show()

 

numpy 인덱싱 및 슬라이싱

연습

슬라이싱을 통해 생성된 서브배열

슬라이싱과 인덱싱은 원래 원본 데이터를 가리키고 있을 뿐, 원본 데이터 그 자체이므로, 서브배열을 변경하는 것으로 원본 배열이 변경된다.

 

 

배열을 복사하려면?

배열사본변수 = 원본배열.copy() 메소드 함수를 사용

 

 

불린 배열 인덱싱

반응형

'Programming > Python' 카테고리의 다른 글

numpy.random 모듈 난수 배열의 생성  (0) 2022.01.14
numpy 브로드캐스팅  (0) 2022.01.14
함수와 뉴런, 인공신경망의 구현  (0) 2022.01.14
파이썬 Numpy 다차원 배열  (0) 2022.01.06
파이썬 NumPy 데이터타입  (0) 2022.01.06