주니어 기초 코딩공부/Python 기초

python 데이터 분석을 위한 패키지-넘파이 NumPy

jju_developer 2023. 3. 9. 17:20
728x90

안녕하세요 jju_developer입니다.

외부 패키지로 숫자 데이터를 좀 더 쉽고 편리하게 다룰 수 있게 도와주는 패키지인 NumPy와 pandas에 대해 살펴보겠습니다.

 

▼▼▼지난 시간▼▼▼

 

python 모듈이란? (모듈, 패키지, 라이브러리 용어 정리)

안녕하세요 jju_developer입니다. 오늘은 파이썬의 모듈에 대해 알아보도록 하겠습니다. 모듈과 패키지 라이브러리를 정확하게 구분을 하는 법이 헷갈려서 찾아봤었습니다. 여기서 모듈 프로그램

jju240.tistory.com

배열 데이터를 효과적으로 다루는 NumPy

많은 숫자 데이터를 하나의 변수에 넣고 관리할 때 리스트는 속도가 느리고 메모리를 많이 차지하는 단점이 있고,

배열(array)을 사용하면 적은 메모리로 많은 데이터를 빠르게 처리할 수 있습니다.

배열은 리스트와 비슷하지만 다음과 같은 점에서 다릅니다.

  1. 모든 원소가 같은 자료형이어야 한다.
  2. 원소의 개수를 바꿀 수 없다.

파이썬은 자체적으로 배열 자료형을 제공하지 않기 때문에 배열을 구현한 다른 패키지를 임포트해야 합니다.

파이썬에서 배열을 사용하기 위한 표준 패키지는 넘파이(NumPy)입니다.

(NumPy는 파이썬으로 과학 연산을 쉽고 빠르게 할 수 있게 만든 패키지입니다.)

 

저는 아나콘다를 불러오면서 넘파이라는 외부모듈이 추가되어 있습니다.

import numpy as np

data1 = [0, 1, 2, 3, 4, 5]
a1 = np.array(data1)
print(a1)   # [0 1 2 3 4 5]
print(a1.dtype)  # int32

data2 = [0.1, 5, 4, 12, 0.5]
a2 = np.array(data2)
print(a2)   # [ 0.1  5.   4.  12.   0.5]
print(a2.dtype)  # float64

print(np.array([0.5, 2, 0.01, 8]))  # [0.5  2.   0.01 8.  ]

print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
'''
[[1 2 3]
 [4 5 6]
 [7 8 9]]
'''

실행결과

NumPy를 이용하면 파이썬의 기본 데이터 형식과 내장 함수를 이용하는 것보다

다차원 배열 데이터를 효과적으로 처리할 수 있습니다.

 

NumPy는 파이썬의 내장 모듈이 아니므로 NumPy를 이용하려면 별도로 설치해야 합니다.

하지만 아나콘다 배포판에는 NumPy가 포함돼 있어서 아나콘다를 설치할 때 NumPy도 설치됩니다.

 

<넘파이 장점>

넘파이의 배열 연산은 C로 구현된 내부 반복문을 사용하기 때문에 파이썬 반복문에 비해 속도가 빠르며

벡터화 연산(vectorized operation)을 이용하여 간단한 코드로도 복잡한 선형 대수 연산을 수행할 수 있습니다.

또한 배열 인덱싱(array indexing)을 사용한 질의(Query) 기능을 이용하여 간단한 코드로도 복잡한 수식을 계산할 수 있습니다.

 

***시퀀스 데이터(seq_data)로 NumPy의 배열을 생성합니다.
• 1: numpy를 이용할 때 numpy를 다 적는 대신 np로 줄여서 작성할 수 있습니다.
• 4: arr_obj = np.array(seq_data) 형식으로 배열을 생성합니다.

배열(Array)이란 순서가 있는 같은 종류의 데이터가 저장된 집합을 말합니다.
• 8~11: NumPy에서 인자로 정수와 실수가 혼합돼 있을 때 모두 실수로 변환합니다.
• 13: array()에 리스트 데이터를 직접 넣어서 배열 객체를 생성할 수 있습니다.
• 15: 다차원 배열도 생성할 수 있습니다.

 

넘파이로 1차원 배열 만들기

넘파이의 array 함수에 리스트를 넣으면 ndarray 클래스 객체 즉, 배열로 변환해 줍니다.

따라서 1차원 배열을 만드는 방법은 다음과 같습니다.

ar = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
ar
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

리스트와 비슷해 보이지만 type 명령으로 자료형을 살펴보면 ndarray임을 알 수 있습니당!

type(ar)
numpy.ndarray

만들어진 ndarray 객체의 표현식(representation)을 보면 바깥쪽에 array()란 것이 붙어 있을 뿐 리스트와 동일한 구조처럼 보이지만, 배열 객체리스트 객체는 많은 차이가 있습니다.

우선 리스트 클래스 객체는 각각의 원소가 다른 자료형이 될 수 있습니다.

그러나 배열 객체 객체는 C언어의 배열처럼 연속적인 메모리 배치를 가지기 때문에 모든 원소가 같은 자료형이어야 합니다.

이러한 제약사항이 있는 대신 원소에 대한 접근과 반복문 실행이 빨라집니다.

 

넘파이로 2차원 배열 만들기

ndarray 는 N-dimensional Array의 약자입니다.

이름 그대로 1차원 배열 이외에도 2차원 배열, 3차원 배열 등의 다차원 배열 자료 구조를 지원합니다.

2차원 배열은 행렬(matrix)이라고 하는데 행렬에서는 가로줄을 행(row)이라고 하고 세로줄을 열(column)이라고 부릅니다.

 

다음과 같이 리스트의 리스트(list of list)를 이용하면 2차원 배열을 생성할 수 있습니다.

안쪽 리스트의 길이는 행렬의 열의 수 즉, 가로 크기가 되고

바깥쪽 리스트의 길이는 행렬의 행의 수, 즉 세로 크기가 됩니다.

예를 들어 2개의 행과 3개의 열을 가지는 2 x 3 배열은 다음과 같이 만든다.

c = np.array([[0, 1, 2], [3, 4, 5]])  # 2 x 3 array
c
array([[0, 1, 2],
       [3, 4, 5]])

2차원 배열의 행과 열의 개수는 다음처럼 구하면 됩니다.

# 행의 갯수
len(c)
2
# 열의 갯수
len(c[0])
3

 

 

넘파이로 3차원 배열 만들기

리스트의 리스트의 리스트를!!!! 이용하면 3차원 배열도 생성할 수 있습니다.

크기를 나타낼 때는 가장 바깥쪽 리스트의 길이부터 가장 안쪽 리스트 길이의 순서로 표시합니다.

예를 들어 2 x 3 x 4 배열은 아래처럼 만들면 됩니다~!

d = np.array([[[1, 2, 3, 4],
               [5, 6, 7, 8],
               [9, 10, 11, 12]],
              [[11, 12, 13, 14],
               [15, 16, 17, 18],
               [19, 20, 21, 22]]])   # 2 x 3 x 4 array

3차원 배열의 깊이, 행, 열은 다음과 같이 구할 수 있습니다.

len(d), len(d[0]), len(d[0][0])
(2, 3, 4)

 

넘파이로 범위 지정하여 배열 생성하기

범위를 지정해 배열 생성
NumPy의 arrange()를 이용해 NumPy 배열을 생성한다.

• 3: arr_obj = np.arange([start,] stop[, step]) 형식
• 4: step이 1인 경우에는 생략할 수 있습니다.
• 5: start가 0인 경우에는 start도 생략할 수 있습니다.
• 7: 12개의 숫자를 생성한 후 4x3 행렬을 만듭니다.
NumPy 배열의 arange()를 이용해
생성한 1차원 배열에 '.reshape(m,n)'을 추가하면 mxn 형태의 2차원 배열(행렬)로 변경할 수 있습니다.
• 17: 1부터 10까지 10개의 데이터를 생성합니다.
np.linespace(start, stop[, num])는 start부터 stop까지 num개의 NumPy 배열을 생성합니다.
• 20: 0부터 π까지 동일한 간격으로 나눈 20개의 데이터를 생성합니다.
import numpy as np

print(np.arange(0, 10, 2))  # [0 2 4 6 8]
print(np.arange(1, 10))     # [1 2 3 4 5 6 7 8 9]
print(np.arange(5))         # [0 1 2 3 4]

b1 = np.arange(12).reshape(4, 3)
print(b1)
'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
'''
print(b1.shape)  # (4, 3)

print(np.linspace(1, 10, 10))
# [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

print(np.linspace(0, np.pi, 20))
'''
[0.         0.16534698 0.33069396 0.49604095 0.66138793 0.82673491
 0.99208189 1.15742887 1.32277585 1.48812284 1.65346982 1.8188168
 1.98416378 2.14951076 2.31485774 2.48020473 2.64555171 2.81089869
 2.97624567 3.14159265]
 '''

실행결과

 

넘파이로 배열의 차원과 크기 알아보는 법

배열의 ndim 속성과 shape 속성을 활용하면 더욱 간단하게 배열의 차원과 크기를 

확인할 수 있습니다.

 

ndim 속성은 배열의 차원, shape 속성은 배열의 크기를 반환합니다.

# a = np.array([1, 2, 3])
print(a.ndim)
print(a.shape)
1
(3,)
# c = np.array([[0, 1, 2], [3, 4, 5]])
print(c.ndim)
print(c.shape)
2
(2, 3)
print(d.ndim)
print(d.shape)
3
(2, 3, 4)

 

넘파이로 배열의 인덱싱 사용법

1차원 배열의 인덱싱은 리스트의 인덱싱과 같습니다!!

a = np.array([0, 1, 2, 3, 4])
a[2]
2
a[-1]
4
 

다차원 배열일 때는 다음과 같이 콤마(comma ,)를 사용하여 접근할 수 있습니다.

콤마로 구분된 차원을 축(axis)이라고도 합니다.

그래프의 x축과 y축을 떠올리면 될 것입니다.

a = np.array([[0, 1, 2], [3, 4, 5]])
a
array([[0, 1, 2],
       [3, 4, 5]])
a[0, 0]  # 첫번째 행의 첫번째 열
0
a[0, 1]  # 첫번째 행의 두번째 열
1
a[-1, -1]  # 마지막 행의 마지막 열
5

 

넘파이로 배열 자르기

배열 객체로 구현한 다차원 배열의 원소 중 복수 개를 접근하려면

일반적인 파이썬 슬라이싱(slicing)과 comma(,)를 함께 사용하면 됩니다. 

 

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

 

a[0, :]  # 첫번째 행 전체

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

 

a[:, 1]  # 두번째 열 전체
array([1, 5])
 
a[1, 1:]  # 두번째 행의 두번째 열부터 끝열까지
array([5, 6, 7])

 

a[:2, :2]
array([[0, 1],
       [4, 5]])

 

지금까지 NumPy python 데이터 분석을 위한 패키지에 대해 알아보았습니다.

 

오늘도 수고하셨습니다~!

728x90