[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

[파이썬] Numpy 기초

inu 2020. 7. 8. 23:38
반응형

Numpy 패키지란?

  • 과학 계산과 데이터 다루기를 용이하게 해주는 패키지
  • 고차원 배열을 객체로 제공하여 이와 관련된 메소드를 제공한다
  • Python에서 C이나 Fortran 에 근접한 연산능력을 보여주기 때문에 유용하다
  • 연산의 벡터화를 제공하기 때문에 코딩하기에도 편리하다
  • 리스트와는 다르게 배열의 크기가 정해져있어, 크기 변경시 새 객체가 생성된다.
  • 원소 자료형이 모두 일치되어야 한다
  • 리스트 자료형 이상의 수많은 수학 연산을 기본으로 제공한다.
  • 다른 패키지에서도 Numpy 배열을 기초 자료형으로 사용하곤 한다.

Numpy 배열 생성 : 기존 객체 이용

import numpy as np # numpy 패키지를 np라는 이름으로 가져온다
np.__version__ # 버전 확인가능

arr1 = np.array([1,3,5,7,9]) # 리스트로 numpy 배열 생성
arr2 = np.array((1,3,5,7,9)) # 튜플로 numpy 배열 생성
type(arr1) # numpy.ndarray 출력 numpy.ndarray는 일종의 행렬 자료구조이다
  • 리스트로 사용하든 튜플로 사용하든 똑같이 numpy.ndarray 자료구조의 numpy 배열을 생성한다.
arr3 = arr1 # 동일 객체
arr4 = arr1.copy() # 다른 객체
  • numpy 배열 객체도 객체이기 때문에 arr3 = arr1과 같이 깊은 복사를 하면 id까지 동일한 완전히 같은 객체가 된다.
  • 따라서 복사가 필요할 경우 copy함수 등의 활용으로 깊은 복사를 해줄 필요가 있다.
a = np.array([[1, 2, 3,], [4, 5, 6], [7, 8, 9]])
a[2][1] # 8
a[2,1] # 8
a[[0,2]] # array([[1, 2, 3], [7, 8, 9]])
  • numpy 배열도 슬라이싱이 가능하다.
  • 다만 특이한 점은 a[2,1]와 같은 방식으로도 요소에 바로 접근할 수 있다는 것이다.
  • a[[0,2]]는 특정 ROW만을 리턴한다.
arr = np.array([[1, 2, 3,], [4, 5, 6], [7, 8, 9]])
len(arr) # 3

arr.size # 9, numpy 배열인 경우에만 가능

arr.shape # (3,3), numpy 배열인 경우에만 가능

arr.ndim # 2, 차원 수

arr.reshape(1,9) # (1,9) 형태로 numpy 배열의 형태를 바꿔준다.
  • size는 단순 길이 이상으로 해당 numpy 배열이 품고있는 요소 개수를 리턴한다. 다차원 배열 형태일 경우에도 총 요소의 개수를 리턴한다. (len은 다차원 배열이어도 한차원만 체크 가능하다)
  • shape는 해당 numpy 배열의 형태를 출력한다
  • ndim은 해당 numpy 배열의 차원수를 출력한다.
  • reshape는 numpy 배열의 형태를 바꿔준다.

Numpy 배열 생성 : arange

np.arange(10) # 0~9.
np.arange(10,20) # 10~19.
np.arange(10, 20, 3) # 10~19, step = 3.
  • arange 함수는 일정 범위, 패턴의 numpy 배열을 생성해준다.
a = np.arange(10)
b = a.reshape(2,5)
c = a.reshape(5,-1)
a[0] = -999
  • 이 경우 a에 적용시킨 -999가 b,c에도 그대로 적용된다.
  • 객체는 다르지만(id는 다름) 서로 메모리 공간을 공유하기 때문이다.
  • 만약 reshape에 '-1'을 파라미터로 넣을 경우 ‘-1'위치의 차원은 원래 배열의 길이와 남은 차원으로 부터 추정한다

Numpy 배열 생성 : linspace

np.linspace(0, 10, 5) # 0과 10 사이 5개의 요소를 가지는 array 생성
arr = np.linspace(0, 10, retstep=True) # 0과 10 사이의 50개(default)의 요소를 가지는 array 생성 및 간격 함께 출력
  • linspace 함수는 일정범위에 일정한 간격으로 요소를 가지는 numpy 배열을 생성한다.
  • 위의 경우 0~10 사이의 5개의 요소를 가지는 numpy array를 생성한다. (array([0.0, 2.5, 5.0, 7.5, 10.0]))
  • 요소 개수값의 default는 50이며, retstep 옵션을 주면 각 요소 사이의 간격값도 함께 출력된다.
  • 아래는 np.linspace(0, 10, retstep=True)의 결과로 생성된 numpy 배열이다.
(array([ 0.        ,  0.20408163,  0.40816327,  0.6122449 ,  0.81632653,
         1.02040816,  1.2244898 ,  1.42857143,  1.63265306,  1.83673469,
         2.04081633,  2.24489796,  2.44897959,  2.65306122,  2.85714286,
         3.06122449,  3.26530612,  3.46938776,  3.67346939,  3.87755102,
         4.08163265,  4.28571429,  4.48979592,  4.69387755,  4.89795918,
         5.10204082,  5.30612245,  5.51020408,  5.71428571,  5.91836735,
         6.12244898,  6.32653061,  6.53061224,  6.73469388,  6.93877551,
         7.14285714,  7.34693878,  7.55102041,  7.75510204,  7.95918367,
         8.16326531,  8.36734694,  8.57142857,  8.7755102 ,  8.97959184,
         9.18367347,  9.3877551 ,  9.59183673,  9.79591837, 10.        ]),
 0.20408163265306123)

Numpy 배열 생성 : zeros

np.zeros(10)
np.zeros((3,4))
np.zeros(5, dtype ='int64') # 특정 type 부여
np.zeros((3,4)).astype('float32')
  • 0으로 이루어진 numpy 배열을 생성한다.
  • 참고로 1로 이루어진 numpy 배열을 생성하는 ones 함수도 존재한다.
  • 2차원(혹은 그 이상)의 형태도 생성이 가능하다.
  • dtype을 명시해 데이터 정해서 부여할 수도 있는데, 기본 type은 float64이다.
  • astype은 자료형을 변경하는 함수이다. (단, 객체자체가 변하는 것은 아니고 변경된 객체를 리턴해준다.)
  • 자료형에 대한 설명 : https://eunguru.tistory.com/216

Numpy 배열의 자료형 통일

arr1 = np.array([111, 2.3,  True, False, False])  # array([111. ,   2.3,   1. ,   0. ,   0. ])
arr2 = np.array([111, 2.3, 'python', 'abc']) # array(['111', '2.3', 'python', 'abc'], dtype='<U32')
arr3 = np.array([111, True, 'abc']) # array(['111', 'True', 'abc'], dtype='<U11')
  • 문자열, 숫자, 불린은 한 numpy배열에 들어가면 하나로 통일된다.
  • 문자열이 제일 힘이 세고, 그 다음으로 숫자 불린 순서라고 생각하면 되겠다.
  • dtype의 <U32나 <U11은 문자열 타입의 한 종류인 정도만 알아두자
반응형