Python

numpy 다루기 1

qlsenddl 2020. 10. 23. 13:59
728x90

 numpy는 다차원 배열(즉, tensor)을 효율적으로 다루기 위한 python 패키지이다. python에 있는 list 자료형과 비슷하다고 생각할 수 있지만, numpy는 숫자 데이터로 이뤄진 배열에 특화되어있고, 그 값이 커질 수록 list보다 효율적으로(계산 시간 小) 데이터를 다룰 수 있어서 Data Science 분야에서 기본적으로 배운다.


- numpy 설치는 https://qlsenddl-lab.tistory.com/3 참고

- numpy를 import할 때는 다음과 같은 방식으로 한다.

import numpy as np

-> 이는 numpy를 import하는데 np라는 이름으로 앞으로 사용한다는 뜻이다. np말고 다른 이름을 붙여도 python 문법 상 상관없지만 대부분 관용적으로 np라는 이름으로 import한다. (수직선에서 0 오른쪽을 +로 두는 것과 같은 느낌.)


1. numpy 선언

np.array(a): a에 대한 numpy array를 선언한다.


ex>

a = np.array(1.)                                                 -> scalar(0차원)

a = np.array([1, 2, 3])                                          -> vector(1차원)

a = np.array([[1, 2, 3], [4, 5, 6]])                             -> matrix(2차원)

a = np.array([[[1, 2, 3], [4, 5, 6]], [[3, 2, 1], [6, 5, 4]]])   -> tensor(3차원)


2. 배열의 크기 확인하기

ndim: 배열의 차원 확인

shape: 배열이 어떤 구조인지 확인(행 수, 열 수 등등)

size: 배열 내의 총 원소의 개수

ex>

a = np.array([[[1, 2, 3], [4, 5, 6]], [[3, 2, 1], [6, 5, 4]]])

print(a.ndim)

>> 3

print(a.shape)

>> (2, 2, 3)

print(a.size)

>> 12


3. 특정 조건의 배열 선언

zeros(a): 모든 원소가 0인 1*a 벡터 생성

zeros((a, b)): 모든 원소가 0인 a*b 행렬 생성

zeros((a, b, c)): 모든 원소가 0인 a*b*c 텐서 생성

ex>

a = np.zeros(10)

print(a)

>> [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

a = np.zeros((2, 5))

print(a)

>> [[0. 0. 0. 0. 0.]

     [0. 0. 0. 0. 0.]]

a = np.zeros((2, 2, 3))

print(a)

>> [[[0. 0. 0.]

     [0. 0. 0.]]

    [[0. 0. 0.]
     [0. 0. 0.]]]


ones(a): 모든 원소가 1인 1*a 벡터 생성

ones((a, b)): 모든 원소가 1인 a*b 행렬 생성

ones((a, b, c)): 모든 원소가 1인 a*b*c 텐서 생성

ex> 

a = np.ones(10)

print(a)

>> [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

a = np.ones((2, 5))

print(a)

>> [[1. 1. 1. 1. 1.]

     [1. 1. 1. 1. 1.]]


full(a, x): 모든 원소가 x인 1*a 벡터 생성

full((a, b), x): 모든 원소가 x인 a*b 행렬 생성

full((a, b, c), x): 모든 원소가 x인 a*b*c 텐서 생성

ex>

a = np.full(2, 5)

print(a)

>> [5 5]

a = np.full((2,5), 5)

print(a)

>> [[5 5 5 5 5]

     [5 5 5 5 5]]


arange(x): 0부터 x-1까지 정수를 원소로 갖는 1*x 벡터 생성

arange(x).astype(float): 0부터 x-1까지 정수가 float 자료형인 원소를 갖는 1*x 벡터 생성

arange(x).reshape((a, b, c)): 0부터 x-1까지 정수를 원소로 갖는 a*b*c 텐서 생성 -> arange는 tuple 형태의 변수를 받지 못하므로 이 방법으로 텐서화 가능

ex>

a = np.arange(10)

print(a)

>> [0 1 2 3 4 5 6 7 8 9]

a = np.arange(10).astype(float)

print(a)

>> [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

a = np.arange(10).reshape((2, 5))

print(a)

>> [[0 1 2 3 4]

     [5 6 7 8 9]]


random: numpy에서 난수를 생성하는 모듈로 그 멤버 함수로 random, randint, randn 등이 있다.

random.random((a, b, c)): 0과 1사이의 uniform distribution을 따르도록 난수를 발생시켜 a*b*c 텐서 생성

random.randint(x, size = a): 0부터 x-1사이의 정수 난수를 발생시켜 1*a 벡터 생성

random.randint(x, y, size = (a, b, c)): x부터 y-1 사이의 정수 난수를 발생시켜 a*b*c 텐서 생성

random.randn(a): 표준정규분포를 따르도록 난수를 발생시켜 1*a 벡터 생성

random.randn(a, b, c): 표준정규분포를 따르도록 난수를 발생시켜 a*b*c 텐서 생성

ex>

a = np.random.random((2, 2, 3))

print(a)

>> [[[0.02187733 0.49557493 0.39354019]

     [0.85821691 0.18544123 0.61908689]]

    [[0.87149933 0.74285271 0.68962718]
     [0.07353272 0.73564568 0.15481899]]]

a = np.random.randint(5, size = 5)

print(a)

>> [3 0 0 3 1]

a = np.random.randint(2, 7, size = (2, 3))

print(a)

>> [[5 3 2]

     [2 5 6]]

a = np.random.randn(3)

print(a)

>> [-1.15008933 -0.60273338 1.10539923]

a = np.random.randn(2, 3)

print(a)

>> [[-2.47314821 0.60510734 0.10481701]

     [ 0.12036902 -0.81803328  0.78400282]]


728x90