본문 바로가기
Programming/Python

[Python] Numpy 파이썬 넘파이 라이브러리 포스팅 하나로 개념부터 정리하기.

by EunjiBest 2022. 5. 2.

[Python] Numpy 파이썬 넘파이 라이브러리 포스팅 하나로 개념부터 문법까지 정리하기.

 

 

 

오랜만에 코딩관련 포스팅!

 

한동안 데이터 분석을 하지 않아서,

넘파이의 존재를 잊고 있었다가 슬슬 개념을 상기시켜볼 겸 간단요약 포스팅을 해보기로했다.

 

 

포스팅이 길기 때문에, 

찾고싶은 개념이 있다면 ctrl +F로 키워드 검색을 하면 좋을 것같다!

 

 

 

Numpy?

 

Numerical Python.

파이썬에서 대규모 다차원 배열을 다룰 수 있도록 도와주는 라이브러리이다.

따라서 데이터 분석을 하는 사람이라면 무조건! 필수적으로 알고있어야하는 라이브러리 문법이다.

 

왜? 다차원 배열을 다뤄야할까?

데이터는 숫자 배열로 이루어져있기 때문이다.

 

예를 들자면,

당장 우리와 친숙한 사진을 생각해보자.

하나하나의 픽셀로 이루어져있고, 그 안에 (RGB)색상 정보, 밝기 등이 숫자로 담겨있다.

 

음성 데이터도 마찬가지이다. 

시간대비 음압을 나타내는 1차원 배열로 나타낸다.

우리가 흔히 알고 있는 아래와 같은 그래프로 표현할 수 있다.

 

따라서 데이터를 분석하고 처리하기 위해서는, 

데이터를 배열로 보고 배열을 효과적으로 가공하는 절차가 중요하다.

 

이런 가공을 좀 더 수월하게 해줄 수 있는 라이브러리가 바로 Numpy이다.

list에 비해서 빠른 연산을 지원하고, 메모리를 효율적으로 사용할 수 있다.

 

 

 

 

배열만들기

 

import numpy as np

np.array([1,2,3,4,5])
#array([1,2,3,4,5])

 

1차원 배열을 만들어보았다.

당연히 numpy를  import시켜주고,

np.array안에 리스트를 넣어주면

리스트로부터 넘파이를 만들 수 있다.

 

np.array([3,1.3,4,5,6,2])

#array([3. , 1.3, 4. , 5. , 6. , 2. ])

 

실수 형태로도 만들 수 있다.

리스트 안에 하나라도 실수가 들어간다면, 다른 숫자도 실수형이 된다.

 

np.array([[1,2],
         [3,4]])
         
#array([[1, 2],
#       [3, 4]])

 

2차원인 배열도 만들고

 

np.array([1,2,3,4], dtype = 'float')
#array([1., 2., 3., 4.])

 

dtype을 이용해서 데이터 타입을 바꿔줄 수 있다.

위 코드에서는 정수를 실수로 바꾸었다.

 

 

배열 데이터 타입

 

파이썬 list와는 다르게 array 는 단일 타입으로 구성되어있다.

파이썬 list는 [1,'은지', 1.3 , True] 이렇게 여러가지 타입이 들어갈 수 있지만

array는 ([1,3,5,6,4]) 이렇게 단일 타입으로만 구성될 수 있다.

 

import numpy as np


arr= np.array([1,2,3,4], dtype = 'float')
#array([1., 2., 3., 4.])
arr.dtype
#dtype('float64')
arr.astype(int)
#array([1, 2, 3, 4])

 

위 코드를 해석해보자.

1. arr 변수에 1,2,3,4 라는 1차열 배열을 float형태로 만들어주었다.

-> 출력값을 보면 1옆에 .이 찍혀있는 것을 볼 수 있다. 실수형이라는 뜻이다.

2. 변수.dtype을 입력하면 arr의 데이터 타입이 나온다.

3. 변수.astype(int)는 float형 배열 arr을 int로 바꾸겠다는 뜻이다.

 

배열 데이터 타입은 아주 전에 포스팅 한 적이 있다.

↓↓↓↓↓↓↓

https://eunjibest.tistory.com/14?category=911295 

 

[Python] numpy (파이썬 넘파이) 데이터형 - 자료형을 확인해야하는 이유

Python numpy (파이썬 넘파이) 데이터형 - int8,  float32, float64 Numpy? 고성능 수치계산을 위한 파이썬 라이브러리. 백터 및 행렬 연산에 편리한 기능을 가지고 있다. 데이터 분석을 할 때 매우 중

eunjibest.tistory.com

 

 

 

배열 만들기 함수 - np.zeros / np.ones / np.arange / np.linspace / np.random

 

np.zeros(10,dtype = int)

#array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

np.zeros()라는 함수이다.

함수 이름같이 0으로 배열을 만드는 함수이다.

 

위 코드는 0을

10개, 데이터타입은 정수로 배열을 만드는 코드이다.

 

 

np.ones((3,5), dtype = float)

'''
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])
'''

 

np.ones() 함수이다.

눈치 챘겠지만, 1로 배열을 채우는 함수이다.

 

위 코드는 

3 X 5 배열, 데이터 타입은 실수로 1을 가득 채우라는 뜻이다.

 

 

np.arange(0,20,2)
#array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])


np.linspace(0,1,5)
#array([0.  , 0.25, 0.5 , 0.75, 1.  ])

 

np.arange()

매개변수가(start, end, step)순이다.

즉, 0부터 20까지 수를 배열하는데 2씩 건너 뛰라는 뜻이다.

 

np.linspace()

0부터 1사이의 수를 5개로 나누어서 배열을 만들어라 뜻이다.

 

 

>>> np.random.random((2,2))
#array([[0.66332449, 0.62885609],
       [0.71412391, 0.53991815]])
       
       
>>> np.random.normal(0,1,(2,2))
#array([[ 1.92211937,  0.65743034],
       [-1.48196849, -0.88380048]])
       
       
>>> np.random.randint(0,10,(2,2))
#array([[6, 1],
       [4, 1]])

 

넘파이에도 random함수가 있다.

하나씩 알아보도록하자.

 

np.random.random((shape))

데이터가 난수로 채워진 배열을 만들 수 있다.

위 코드에서는 2X2 행렬로 채워진 배열을 만들라는 뜻이다. 

 

np.random.noraml(평균, 표준편차,(shape))

정규 분포로도 데이터를 추출할 수 있다.

위 코드는

평균이 0이고, 표준편차가 1을 ,2X2 행렬로 추출하라는 뜻이다

 

np.random.randint(start,end,(shape))
start부터 end까지의 숫자를, shape 행렬로 추출할 수 있다.
그럼 당연히 위 코드는
0~10사이의 수를 2X2로 추출하라는 뜻이 되겠다.
 
 
 
 
array의 특징 함수 - ndim / shape / size / dtype

 

>>> arr = np.random.randint(10,size = (2,2))
array([[2, 9],
       [3, 8]])

>>> arr.ndim
2
>>> arr.shape
(2, 2)
>>> arr.size
4
>>> arr.dtype
dtype('int64')

 

ndim : 배열의 차원이 몇차원인가?

shape :  행렬과 배열의 모양

size : 이 안에 원소가 몇개인지? = shape의 곱

dtype : 데이터 타입

 

 

 

인덱싱 / 슬라이싱

 

인덱싱은 list와 별 다를게 크게 없지만 조금 다른 점이 있으니 헷갈리지 않고 구분하여 사용하여야한다.

(모든 인덱싱 순서는 0부터 센다.)

 

>>> x = np.arange(7)
array([0, 1, 2, 3, 4, 5, 6])

>>> x[3]
3

>>> x[0] = 10
array([10,  1,  2,  3,  4,  5,  6])

 

x에 array를 만들어보았다.

x[3] :  3번째, 해당 원소를 출력 

x[0] = 10 : 인덱스0을 10으로 바꾼다. 

 

>>> x[1:5]
array([1, 2, 3, 4])

>>> x[1:]
array([1, 2, 3, 4, 5, 6])

>>> x[:4]
array([10,  1,  2,  3])

>>> x[::2]
array([10,  2,  4,  6])

 

x[1:5] : 1부터 4까지

x[1:] : 1부터 모두

x[:4] : 4아래부터 모두

x[::2] : 전체 데이터 배열에서 2씩 건너 뛰어서 출력

 

 

 

 

shape 모양 바꾸기 - reshape / concatenate / split

 

>>> x = np.arange(8)
array([0, 1, 2, 3, 4, 5, 6,7])

>>> x.shape
(8,)

>>> x2 = x.reshape((2,4))
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

>>> x2.shape
(2, 4)

 

reshape는 shape를 변경한다. 

위에서 shape는 행렬이라고 했다. 즉, 차원

 

코드를 보면

x 는 1차원 행렬이다.

 

x에 reshape()를 2X4로 해주었다.

출력값이 2차원으로 바뀐 것을 확인할 수 있다.

 

shape도 확인해보자. (2,4)로 잘 바뀌었다.

 

 

>>> x = np.array([0,1,2])
>>> y = np.array([4,5,6])

>>> np.concatenate([x,y])

array([0, 1, 2, 4, 5, 6])

 

다음은 concatenate()이다.

두개의 array를 합치는 것을 위 코드에서 볼 수 있다.

 

위 코드처럼 1차원일 때에는 방향이 상관 없지만

1차원 이상의 배열일 경우에는

어느 방향으로 합치느냐?가 중요하다.

 

위에서 만들어 뒀던 x2를 가지고 확인해보자.

 

array([[0, 1, 2, 3],

        [4, 5, 6, 7]])

 

>>> np.concatenate([x2,x2], axis = 0)
array([[0, 1, 2, 3],
       [4, 5, 6, 7],
       [0, 1, 2, 3],
       [4, 5, 6, 7]])
       
>>> np.concatenate([x2,x2], axis = 1)
array([[0, 1, 2, 3, 0, 1, 2, 3],
       [4, 5, 6, 7, 4, 5, 6, 7]])

 

axis는 축을 결정한다.

axis = 0이면 세로.

axis = 1이면 가로.

 

 

>>> matrix = np.arange(16).reshape(4,4)

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
            
>>> upper,lower = np.split(matrix,[3],axis = 0)
>>> upper
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> lower
array([[12, 13, 14, 15]])

 

np.split()은 axis 축을 기준으로 나누어준다.

 

매개변수는

np.split(배열, [축 기준 몇번째 인덱스를 기준으로], axis = 축)

 

역시

axis = 0이면 세로.

axis = 1이면 가로.

 

 

 

Numpy 연산

 

파이썬에서 연산은 상당히 느리게 수행된다.

작은 크기의 데이터는 간단하게 계산이 가능하지만,

보통 numpy를 사용하는 이유는 엄청나게 많은 데이터들을 배열로 다루기 위함이기 때문에

그에 합당한 연산을 지원한다.

 

>>> x = np.arange(4)
array([0, 1, 2, 3])

>>> x+5
array([5, 6, 7, 8])

>>> x-5
array([-5, -4, -3, -2])

>>> x*5
array([ 0,  5, 10, 15])

>>> x/5
array([0. , 0.2, 0.4, 0.6])


파이썬을 사용한다면 for문을 사용해서 돌려야하지만,

numpy 라이브러리를 이용하면 위 처럼 간단하게 배열의 연산이 가능하다.

 

 

역시,

다차원 행렬에서도 적용이 가능하다.

 

>>> x = np.arange(4).reshape((2,2))
array([[0, 1],
       [2, 3]])
       
>>> y = np.random.randint(10,size=(2,2))       
array([[5, 8],
       [3, 5]])       
       
>>>  x+y
 array([[5, 9],
       [5, 8]])
 
>>>  x-y
 array([[-5, -7],
       [-1, -2]])    
       
>>> x*y
array([[ 0,  8],
       [ 6, 15]])
       
>>> x/y
array([[0.        , 0.125     ],
       [0.66666667, 0.6       ]])

 

랜덤으로 2x2 행렬 x,y를 만들어 연산을 해보았다.

복잡한 연산을 빠르게 반환해준다.

 

 

 

 

 

Broadcasting

 

shape이 다른 array끼리도 연산이 가능하다.

이를 브로드 캐스팅(Broadcasting)이라고 한다.

 

 

matrix + np.array([1,2,3])

위 식을 그림으로 그려봤다.

 

matrix(3x3)와 array를 더하면 3x3이 나온다.

1차원에서 같은 데이터로 차원을 늘려서 계산이 되는 것이다.

 

이처럼 모양이 달라도 계산이 된다.

 

 

 

집계함수 - sum / min / max / mean / std

 

데이터에 대한 요약 통계를 확인할 수 있다.

 

 

>>> x = np.arange(8).reshape((2,4))
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

>>> np.sum(x)
28

>>> np.min(x)
0

>>> np.max(x)
7

>>> np.mean(x)
3.5

>>> np.std(x)
2.29128784747792

 

np.sum() :  총 합

np.min() :  최소값

np.max() :  최대값

np.mean() :  평균

np.std() : 표준편차

 

>>> np.sum(x,axis= 0)
array([ 4,  6,  8, 10])

>>> np.sum(x, axis = 1)
array([ 6, 22])

 

sum은 그냥 사용하면 모든 요소를 다 더하지만

축을 정해서 사용할 수 있다.

 

axis = 0 -> 세로

axis = 1 -> 가로

 

 

 

그 외 argmax()와 argmin()에 대해서도 포스팅을 했었다.

https://eunjibest.tistory.com/15?category=911295 

 

[Python] Numpy argmax( ),argmin( ),np.where( ) - 최소, 최대, 조건 색인값 찾기

[Python] Numpy argmax( ),argmin( ),np.where( ) - 최소, 최대, 조건 색인값 찾기 np.min(), np.max() >>> import numpy as np >>> x = [5,6,8,1,3,9,10] >>> np.min(x) 1 np.min()은 리스트안에 최소..

eunjibest.tistory.com

 

 

 

 

 

마스킹 연산

 

Ture와 Flase array를 이용해서 특정한 값들을 뽑아내는 방법이다.

어려운 것 없이, 기본적으로 다음과 같이 사용한다.

 

>>> x = np.arange(8)
array([0, 1, 2, 3, 4, 5, 6, 7])

>>> x < 3
array([ True,  True,  True, False, False, False, False, False])

>>> x > 5
array([False, False, False, False, False, False,  True,  True])

>>> x[x<3]
array([0, 1, 2])

 

x에 해당되는 조건에 따라서 True와 False가 반환된다.

 

x[x>3] 이 경우가 조금 특이하다.

인덱스 처럼 연산이 들어가 있는데,

x가 Ture인 아이들만 출력이 된다.

 

 

 

 


생각보다 길고, 오래걸릴 줄 알았던 포스팅이

간단하게 끝나서 조금 당황스럽다..

그래도

필수적으로 필요한 문법들은 다 정리 한 것같다.

 

공부하다가 다른

넘파이 문법들이 있으면, 추가로 포스팅을 해야겠다!

 

다음 포스팅은 

Pandas 개념정리이다.

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글