본문 바로가기
기본적인프로그래밍/python

[Python] Data science - numpy 기초 (1)

by 인포메틱스 2020. 7. 13.
반응형

오늘 포스팅은 data science에서 중요한 모듈중 하나인 numpy에 대해서 배워보도록 하겠습니다.

 

 

최근 기계학습(머신러닝, machine learning)과 deep learning에 대한 관심이 높아지면서 그에 따른 프로그래밍 언어와 모듈들이 같이 중요해지게 되었습니다.

 

 

 프로그래밍 언어로서 데이터를 다루고 분석하는 것은 R이 더 쉽지만,  처리 속도측면이나 최근 동향은 python으로 많이 치우쳐 지는 것을 알 수가 있습니다.

 

 python의 빠른 처리 속도를 장점으로 python에서도 R과 비슷하게 데이터 전 처리를 쉽게 하기위해서 나온 모듈이 pandas입니다. 그리고 R과 비슷하게 데이터프레임같은 형태를 다룰 수 있게 하는 모듈이 numpy입니다.

 

그밖에 scikit-learn,keras,matplotlib등 machine learning 에 관련된 많은 모듈이 있으나, 이건 나중에 시간이 될때 포스팅 하도록 하겠습니다.

 


numpy에서 가장 중요한것은 다차원배열을 지원합니다. 다차원이 무엇이냐?!

 

다음 코드를 보시면 이해가 될수 있습니다. (np == numpy)


x=[1,2,3,4,5,6] # 1차원 변수
y=[1,2,3,4,5,6] # 1차원 변수
x[1] # 1차원 함수 호출
y[1] # 1차원 함수 호출

matrix=[[1,2,3,4,5],[1,3,4,2,5]] # 2*5 # 2차원 변수
mat[x][y] # x (x < 5),y (y < 2)는 숫자 2차원 함수 호출

array=np.array([[[1,2,3,4,5],[5,4,3,2,1]],[[5,3,2,1,4],[5,3,2,4,1]]]) # 3,2,5 3차원 변수
array[z,x,y] # x (x < n),y (y < m),z (z < r)는 숫자
array[1,] # 2번째 matrix불러오기
array[1,0,1] # 2번째 x=1,y=2인 값 가져오기

n차원 데이터가 필요한 이유그림에서 각 단위마다 RGB를 이용하여 단위의 색을 결정할 수 있기 때문에 이러한 변수데이터를 분석할때 유용하게 사용됩니다.  (R에는 array라는 함수가 있습니다.)

 

1.np.zeros(),np.ones(),np.full(),np.eye(),np.empty(),np.[]_like()

 

arrary를 쉽게 만드는 방법 중에는 np.zeros(),np.ones(),np.full()가 있습니다.

 

>>> np.zeros((5)) # 1차원
array([0., 0., 0., 0., 0.])
>>> np.ones((6)) # 1차원
array([1., 1., 1., 1., 1., 1.])
>>> np.full((5),23) # 1차원
array([23, 23, 23, 23, 23])
>>> 
>>> np.zeros((5,6)) # 2차원
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])
>>> np.ones((6,5)) # 2차원
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., 1.],
       [1., 1., 1., 1., 1.]])
>>> np.full((3,4),23) # 2차원
array([[23, 23, 23, 23],
       [23, 23, 23, 23],
       [23, 23, 23, 23]])
>>> 
>>> np.zeros((2,3,4)) # 3차원
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])
>>> np.ones((4,3,2)) # 3차원
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.]]])
>>> np.full((4,2,3),23)
array([[[23, 23, 23],
        [23, 23, 23]],

       [[23, 23, 23],
        [23, 23, 23]],

       [[23, 23, 23],
        [23, 23, 23]],

       [[23, 23, 23],
        [23, 23, 23]]])
>>> 

 기타로 n*m  단위행렬을 구할수 있는 np.eye()가 있고,

>>> np.eye(1)
array([[1.]])
>>> np.eye(2)
array([[1., 0.],
       [0., 1.]])
>>> np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> np.eye(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
>>> np.eye(4,3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])
>>>

왜 사용하는지는 잘 모르겠지만 np.empty()가 있습니다. (메모리에 저장되어있는 값이라고는 이야기하는데 사용하는 곳을 모르겠습니다.)

>>> np.empty((3))
array([1., 1., 1.])
>>> np.empty((3,2))
array([[1., 1.],
       [1., 1.],
       [1., 1.]])
>>> np.empty((3,3,2))
array([[[ 1.75471880e-316,  0.00000000e+000],
        [ 6.96768953e+252,  4.50475575e+257],
        [ 1.69432400e-307,  1.35393862e+241]],

       [[ 4.15529082e+175,  2.64520913e+185],
        [ 1.46910632e+195,  6.89912755e-310],
        [-8.61110274e-295,  6.92534952e-310]],

       [[ 6.92534952e-310,  2.34814645e-135],
        [ 6.92534952e-310,  6.92534952e-310],
        [ 7.37188290e+059,  6.92534952e-310]]])
>>>

그리고 특정 array 형식을 복사할수있는 []_like() []안에는 ones,zeros,empty가 들어 갈수 있습니다.

>>> a=np.empty((3,4))
>>> a
array([[1.14e-322, 1.14e-322, 1.14e-322, 1.14e-322],
       [1.14e-322, 1.14e-322, 1.14e-322, 1.14e-322],
       [1.14e-322, 1.14e-322, 1.14e-322, 1.14e-322]])
>>> b=np.zeros_like(a)
>>> b
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
>>> b=np.ones_like(a)
>>> b
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
>>> 

위와 같은 []_like기능특정 데이터값을 초기화 시킬때 사용하면 괜찮을 것 같습니다. (혹은 같은 배열의 데이터값을 만들때 이용)

 

2.datatype (dtype), astype(), np.[int32,int64,float32,float64]

 

array 데이터를 만들때 중요한 것이 있는데, 그것은 바로 datatype(dtype)을 확인하는 것이다.

 

np.array에서 구조 정보 이외에도 dtype이라는 parameter를 받습니다. 들어갈 값들이 숫자인지 숫자중에서도 int(정수)인지, float(실수)인지, complex(허수)인지가 중요하고,  다른 타입으로는 bool(논리형),character(문자)인지도 중요 합니다.

 

주로 사용하는 값들은 int32, int64, float32, float64, complex64, bool입니다.

>>> np.array([[[1,2,3,4],[2,3,5,23]],[[5,3,2,1],[6,3,23,1]]],dtype=np.float32)
array([[[ 1.,  2.,  3.,  4.],
        [ 2.,  3.,  5., 23.]],

       [[ 5.,  3.,  2.,  1.],
        [ 6.,  3., 23.,  1.]]], dtype=float32)
>>> np.empty((3,2,3),dtype=np.int32)
array([[[         0, 1072693248,          0],
        [         0,          0,          0]],

       [[         0,          0,          0],
        [1072693248,          0,          0]],

       [[         0,          0,          0],
        [         0,          0, 1072693248]]], dtype=int32)
>>> 

 

dtype을 변경하는 방법도 있는데 이럴 때는 astype()을 이용합니다. 혹은 np.float32,np.float64 ..etc를 이용합니다.

>>> a=np.empty((4,2),dtype=np.int32)
>>> a
array([[         0, 1072693248],
       [         0,          0],
       [         0,          0],
       [         0,          0]], dtype=int32)
>>> a.astype(np.float32)
array([[0.00000000e+00, 1.07269325e+09],
       [0.00000000e+00, 0.00000000e+00],
       [0.00000000e+00, 0.00000000e+00],
       [0.00000000e+00, 0.00000000e+00]], dtype=float32)
>>> np.float32(a)
array([[0.00000000e+00, 1.07269325e+09],
       [0.00000000e+00, 0.00000000e+00],
       [0.00000000e+00, 0.00000000e+00],
       [0.00000000e+00, 0.00000000e+00]], dtype=float32)
>>> 

 

 

 

 

 

 

 

728x90
반응형

댓글