Python/Pandas&Numpy

NumPy intro. + fundamentals 1/2

metamong 2022. 3. 20.

1. 개념

* NumPy = Numerical Python

- Python에서 대규모 다차원 배열을 다룰 수 있게 도와주는 library

 

* 데이터의 대부분은 숫자 배열로 볼 수 있기에 NumPy는 꼭 필요

- 이미지나 소리 등 실생활 대부분이 숫자로 표현됨

 

* NumPy는 반복문 없이 배열 처리가 가능하며, python list에 비해 빠른 연산을 지원하고 메모리를 효율적으로 사용할 수 있다

 

* list)

list_arr = list(range(5))
print(list_arr) #[0,1,2,3,4] - comma로 구분
print(type(list_arr)) #<class 'list'>

 

* numpy)

- import 사용

- numpy 배열 생성 및 출력 형태 확인해 보면 ndarray가 생성됨을 확인할 수 있다.

- ndarray는 n차원의 배열(n-dimensional array)이다

import numpy as np #conventional 'np' alias

np_arr = np.array(range(5))
np_arr #array([0, 1, 2, 3, 4])
print(type(np_arr)) #<class 'numpy.ndarray'>

 

- 2차원 이상의 다차원 numpy ndarray 나타낼려면 중첩하면 된다.

#2-dimensional np array
arr2 = np.array([[1,2,3],[4,5,6]])
arr2
'''
array([[1, 2, 3],
       [4, 5, 6]])
'''

#3-dimensional np array
arr3 = np.array([[[1,2,3],[4,5,6],[7,8,9]],
                 [[1,2,3],[4,5,6],[7,8,9]]])
arr3
'''
array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]])
'''

 

* 또한, numpy 배열은 여러 갈래의 입체적인 데이터 구조로, 데이터 방향을 axis로 표현한다.

 

* 행방향(높이) axis = 0, 열방향(폭) axis = 1, 채널 방향 axis = 2

2. 배열

[1] dtype

* array는 python list와 달리 같은 data type만 저장 가능하다

* dtype을 통해 float 형태로만 가능하며 float64임을 확인까지 가능

- astype()으로 배열 내의 모든 데이터를 다른 데이터 타입으로 변환 가능

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

 

dtype 설명 다양한 표현
int 정수형 타입 i, int_, int32, int64, i8
float 실수형 타입 f, float_, float32, float64, f8
str 문자열 타입 str, U, U32
bool 부울 타입 ?, bool_

[2] 배열의 속성

* ndarray의 차원 관련 속성: ndim(몇 차원인지) & shape(양)

list = [0, 1, 2, 3]
arr = np.array(list)
print(arr.ndim) #1
print(arr.shape) #(4,)

list = [[0,1,2],[3,4,5]]
arr = np.array(list)
print(arr.ndim) #2
print(arr.shape) #(2,3)

 

* ndarray의 크기 속성 & shape 조절

arr = np.array([0,1,2,3,4,5])
print("arr.shape : {}".format(arr.shape)) # arr.shape : (6,)
print("배열 요소의 수 : {}".format(arr.size)) # 배열 요소의 수 : 6
print("배열의 길이 : {}".format(len(arr))) # 배열의 길이 : 6

 

- size는 배열 안에 들어가는 요소의 개수이며

- len은 세로 행 길이

 

- shape을 바꾸어 본다면

...
arr.shape = 3, 2
print("arr.shape : {}".format(arr.shape)) # arr.shape : (3,2)
print("배열 요소의 수 : {}".format(arr.size)) # 배열 요소의 수 : 6
print("배열의 길이 : {}".format(len(arr))) # 배열의 길이 : 3

3. indexing & slicing

[1] indexing

* indexing - 인덱스로 값을 찾아냄

* arange() method를 이용해서 배열을 만들 수 있음 ((하단) arange(7)이면 0부터 6까지의 정수로 구성된 배열을 만든다는 뜻)

* 배열은 index 0부터 시작함. 즉 아래 index 7은 범위에 벗어나서 오류 

x = np.arange(7)

print(x) #[0 1 2 3 4 5 6]
print(x[3]) #3
print(x[7])
# IndexError: index 7 is out of bounds

x[0] = 10
print(x) # [10 1 2 3 4 5 6]

 

* (하단) arange method(1,13,1)이면 1부터 12까지 구성된 정수이되, 마지막 세번째 인자는 step으로 간격을 뜻한다. 즉 1부터 step 1씩의 간격으로 정수를 출력한다는 뜻

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

print(x[2,3]) #12

[2] slicing

* slicing - 인덱스의 값으로 배열의 일부분을 가져옴

* :(콜론) 앞 뒤로 공백이면 각각 처음이나 끝을 의미함

* 콜론을 기준으로 (콜론 뒤의 수 - 1)의 index까지의 수를 가져오면 된다.

* 콜론이 두 개 있으면 마지막 자리의 수는 '간격'을 뜻함

- 즉, 처음부터 시작해서 간격을 둔 해당 자리의 값을 출력하라는 뜻

x = np.arange(7)
print(x) # [0 1 2 3 4 5 6]

print(x[1:4]) #[1 2 3]
print(x[1:]) #[1 2 3 4 5 6]
print(x[:4]) #[0 1 2 3]
print(x[::2]) #[0 2 4 6]

 

- [:2:3]의 경우 index 0부터 2까지 가되 3을 간격으로 두기에 index 0만 해당

x = np.arange(1,13,1)
x.shape = 3,4

print(x) 
#[[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]]

print(x[1:2,:2:3]) #[[5]]
print(x[1:,:2])
# [[5 6]
#  [9 10]]

[3] Boolean Indexing

* Boolean indexing: 배열의 각 요소의 선택 여부를 boolean mask를 이용하여 지정하는 방식

- (1) 조건에 맞는 데이터를 가져오고 (2)참, 거짓을 알려준다

x = np.arange(7)

# Boolean mask True. False로 구성된 mask array
print(x) # [0 1 2 3 4 5 6]
print(x<3) #[True True True False False False False]
print(x>7) #[False False False False False False False]

 

* 또는 boolean mask의 True 요소에 해당하는 index을 조회

x = np.arange(7)

print(x[x<3]) # [0 1 2]
print(x[x%2 == 0]) #[0 2 4 6]

[4] Fancy Indexing

* Fancy Indexing: 배열의 각 요소 선택을 index 배열을 전달하여 지정하는 방식 (대괄호가 두 번 선택됨)

* 즉, 찾고 싶은 자리 = index에 어떤 값이 있는 지 선택

- 내가 알고자 하는 자리의 index를 대입하여 해당 자리의 값을 구한다

x = np.arange(7)
print(x)

print(x[[1, 3, 5]]) #[1 3 5]

 

- x[[0,2]]의 경우 0번째와 2번째 행 출력

x = np.arange(1,13,1).reshape(3,4)

print(x[[0,2]])
#[[1 2 3 4]
# [9 10 11 12]]

[5] indexing & slicing

- 원하는 요소를 지정하기 위해 indexing과 slicing을 적절히 조합하여 사용이 가능하다

x = np.arange(1,13,1).reshape(3,4)

print(x[1:2,2]) #[7]
print(x[[0,2],2]) #[3 11]
print(x[[0,2],:2]) #[[1 2]
#                    [9 10]]

## numpy - 공식 docu() 보면서 numpy의 여러 기능들 posting에 담아서 올릴 예정! ## 🤗

 

* 출처1) 2021 NIPA/AI 기본/응용 교육과정

* 출처2)

- 강의명: 2023 DAS(디지털애널리틱스융합과정) 사전교육 - Python 기초

- 교수자: 이정원

 

댓글