Data Science/Machine Learning

1. numpy - numpy 모듈 & ndarray 이해

HJChung 2020. 9. 14. 12:45

 1. numpy 모듈 & ndarray 이해

1) numpy를 사용하는 이유

  • 성능 : 파이썬 리스트 보다 빠름
  • 메모리 사이즈 : 파이썬 리스트보다 적은 메모리 사용
  • 빌트인 함수 : 선형대수, 통계관련 여러 함수 내장

2) ndarray란

N 차원(Dimenstion) 배열(Array) 객체

3) ndarray의 이용: 아래 첨부한 jupyter notebook 코드 화면을 통해 더 자세히 알 수 있다. 

1. ndarray의 생성: np.array 이용 또는 np.arange이용

2. ndarray의 shape 확인: ndarray.shape 속성이용

3. ndarray의 dimension확인: ndarray.dim 속성 이용

1차원)

array1 = np.array([1, 2, 3])
print(array1) #[1 2 3]

array1.ndim #차원 확인 1
array1.shape #shape 확인 (3,) #주의! 1차원일 때는 요소 개수만 나옴

 2차원)

array2 = np.array([[1, 2, 3], [4, 5, 6]])
print(array2) #[[1 2 3]
	    #[4 5 6]]

array2.ndim #차원 확인 2
array2.shape #shape 확인 (2,3) 

 

4. ndarray 내의 데이터 타입 확인: ndarray.dtype 이용

※ 헷갈려.. 변수 자체의 데이터 타입 확인: type([변수명]), ndarray 내의 데이터 타입 확인: [ndarray명].dtype

ndarray 내의 데이터 타입은 숫자, 문자열, boolean 등 모두 가능하다. 그러나! ndarray내의 테이터 타입은 통일되어야 한다. 

(숫자형: int(8bit, 16bit, 32bit), unssigned int형(8bit, 16bit, 32bit), float형(16bit, 32bit, 64bit, 128bit), complex형)

즉, 

[1 2 3] (o)

[1.1 , 2.2, 3.3](o)

[True False True] (o)

['하하' '키키' '호호'] (o)

[1 2.3 'hello'] (x)

list1 = [1, 2, 3]
print(type(list1))#<class 'list'>

array3 = np.array(list1)
prinnt(type(array3)) #<class 'numpy.ndarray'>
print(array3.dtype) #int32
print(array3) #[1 2 3]

5. ndarray 데이터타입 변환: astype() 이용

이런 데이터 타입 변경은 대용량 데이터를 ndarray로 만들 때 메모리를 절약하기 위해 자주 사용한다. 이런 데이터타입 변환으로 메모리를 절약한는 것이 새발의 피처럼 느껴졌는데.. 책을 읽고 난 후에 생각이 바뀌었다. 

'파이썬 기반의 머신러닝 알골리즘은 대부분 메모리로 데이터를 저체 로딩한 다음 이를 기반으로 알골리즘을 적용하기 때문에 대용량의데이터를 로딩할 때는 수행 속도가 느려지거나 메모리 부족으로 오류가 발생할 수 있다. - 머신러닝 파이썬 완벽가이드 18p'

array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64')
print(array_float.dtype) #float64

6. ndarray의 차원과 크기를 변경: reshape()

array1 = [0 1 2 3 4 5 6 7 8 9]
array2 = array1.reshape(2, 5)

array2 # [[0 1 2 3 4], 
	# [5 6 7 8 9]]
    

가 된다. 또한

reshape(-1, 5)와 같이 인자에 -1을 부여하면 -1에 해당하는 axis의 크기는 가변적이되  -1이 아닌 인자값에 해당하는 axis크기는 주어진 인자값으로 고정하여 ndarray의 shape를 변환한다. 

array1 = [0 1 2 3 4 5 6 7 8 9]
array2 = array1.reshape(-1, 5)
array2.shape() #(10/2 로 가변적으로 변화, 5로 고정) 따라서 (2, 5)가 된다. 

※ 그리고! 머신런닝의 API 인자로 주어져야할 때, 요구하는 형식에 맞게 줘야하는데 주로 1차원 ndarray를 명확하게 2차원 ndarray로 변환하여 입력하기를 원하거나, 또는 반대의 경우가 있다. 이때는 reshape(-1, 1)와 reshape(-1,) 로 변환이 많이 사용된다. 

array1d = [0 1 2 3 4]
array2d = array1d.reshape(-1, 1) #2차원으로 변환하되 column axis의 크기가 1로 고정
array2d # [[0][1][2][3][4]]
array2d = [[0][1][2][3][4]]
array1d = array2d.reshape(-1,) #1차원으로 변환
array1d #[0 1 2 3 4]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. numpy 모듈 & ndarray 이해

numpy를 사용하는 이유

  • 성능 : 파이썬 리스트 보다 빠름
  • 메모리 사이즈 : 파이썬 리스트보다 적은 메모리 사용
  • 빌트인 함수 : 선형대수, 통계관련 여러 함수 내장
IMG_0A2B2209819F-1.jpeg
In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [2]:
#numpy array 생성
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
In [3]:
plt.plot(x, y)
Out[3]:
[<matplotlib.lines.Line2D at 0x11b9daf98>]
 
 

2. ndarray 생성

  • np.array 함수 이용
  • np.arange 함수 이용
 

방법1. np.array 함수 이용

In [4]:
x = np.array([1, 2, 3]) #1차원
print(x)
 
[1 2 3]
In [7]:
y = np.array([[1, 2, 3] , [14, 32,42123]])
print(y)
 
[[    1     2     3]
 [   14    32 42123]]
 

방법2. np.arange 함수 이용

In [11]:
x = np.arange(10)
x
Out[11]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [14]:
y = np.arange(0, 10, 2)
y
Out[14]:
array([0, 2, 4, 6, 8])
 

np.ones, np.zeros로 생성 : tuple이용

In [15]:
np.ones((4, 5))
Out[15]:
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])
In [16]:
np.ones((2, 3, 4)) #3차원 : 3행 4열짜리 행렬이 2개가 있다
Out[16]:
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])
In [18]:
np.zeros((2, 2, 3)) #모든 원소가 0
Out[18]:
array([[[0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.]]])
 

np.empty, np.full로 생성하기

  • np.empty : 어떤 값도 상관없이 임의로 초기화해줘서 생성하는 행렬
  • np.full : 특정 숫자로만 채워진 행렬
In [22]:
np.empty((2, 4))
Out[22]:
array([[ 36.575,  24.2  , 371.375,  24.2  ],
       [ 36.575, 241.64 , 371.375, 241.64 ]])
In [24]:
np.full((2, 2, 3), 7)
Out[24]:
array([[[7, 7, 7],
        [7, 7, 7]],

       [[7, 7, 7],
        [7, 7, 7]]])
 

np.eye로 생성하기 : 단위행렬 생성

In [25]:
np.eye(5) #대각선만 1이고 나머지는 다 0인 단위 행렬 만들기
Out[25]:
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])
 

np.linspace로 생성하기

In [26]:
np.linspace(1, 10, 3) #start와 end를 포함해서 모든 원소간의 차가 같도록 몇 개로 나누어라
Out[26]:
array([ 1. ,  5.5, 10. ])
In [27]:
np.linspace(1, 10, 4)
Out[27]:
array([ 1.,  4.,  7., 10.])
 

reshape 함수 사용

: ndarray의 형태, 차원을 바꾸기 위해 사용

In [28]:
x = np.arange(1, 16)
print(x)
x.shape
 
[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
Out[28]:
(15,)
In [31]:
x.reshape(3, 5)
Out[31]:
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])
 

random 서브 모듈을 이용한 ndarray 생성

 

1. rand 함수 : [0, 1) 사이의 랜덤 값이 생성

In [36]:
x = np.random.rand(2, 3)
x
Out[36]:
array([[0.94995925, 0.14616911, 0.0247517 ],
       [0.91791053, 0.23154267, 0.82762608]])
 

2. randn 함수 : normal distribution(정규분포) 로 샘플링 된 랜덤 ndarray 생성

In [37]:
x = np.random.randn(3, 4)
x
Out[37]:
array([[ 0.59909898, -0.90309067, -0.10235144,  1.1005022 ],
       [-0.38567095, -0.04614319, -2.45086774, -0.90284212],
       [ 0.51464727,  0.85436548,  1.01045209, -0.94768371]])
 

3. randint 함수 : 특정 정수 사이에서 랜덤하게 샘플링

In [40]:
x = np.random.randint(3, 8, (4, 5)) #randint(low, high=None, size=None, dtype='l')
x
Out[40]:
array([[6, 5, 7, 6, 6],
       [7, 3, 4, 5, 3],
       [4, 7, 4, 6, 7],
       [4, 3, 5, 4, 7]])
 

seed 함수 : 랜덤한 값을 동일하게 다시 생성하고자 할 때 사용

In [52]:
np.random.seed(100)#아무 숫자나 주어도 됨 랜덤하지만 이 숫자에 관련된 고정된 수
np.random.randn(3, 4)
Out[52]:
array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],
       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],
       [-0.18949583,  0.25500144, -0.45802699,  0.43516349]])
 

choice 함수 : 주어진 1차원 ndarray로 부터 랜덤으로 샘플링하는 것이다.

  • 정수가 주어진 경우, np.arange로 간주
In [53]:
np.random.choice(100, size =(3, 4))
Out[53]:
array([[83,  4, 91, 59],
       [67,  7, 49, 47],
       [65, 61, 14, 55]])
In [54]:
x = np.array([1, 2, 3, 1.5, 3.5])
np.random.choice(x, (2, 2)) #x 중에서 2*2 즉 4개를 뽑아서(중복 허용(replace = True로 되어있어서)) arange 만든다. 
Out[54]:
array([[1.5, 1. ],
       [3. , 2. ]])
In [56]:
np.random.choice(x, (2, 2), replace = False)
Out[56]:
array([[1. , 3.5],
       [1.5, 3. ]])
 

확률 분포에 따른 ndarray생성

 

uniform 함수 이용

In [57]:
np.random.uniform(1.0, 3.0, (2, 2)) #uniform 확률 분포([low, high) )에서 랜덤 샘플링
Out[57]:
array([[2.19768675, 2.20760908],
       [1.21029537, 1.76388689]])
 

normal 함수 이용

In [58]:
np.random.normal(size = (3, 4))
Out[58]:
array([[ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],
       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],
       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])
In [ ]: