KDT 수업/Python

[데이터분석] NUMPY 넘파이

니니는 진짜 전설이다 2023. 5. 30. 17:49

목차

  • 1. Numpy
    • 1-1. ndarray 다차원 배열
    • 1-2. ndarray 의 datatype
    • 1-3. ndarray 의 슬라이싱
    • 1-4. Fancy 인덱싱
    • 1-5. Boolean 인덱싱

1. NumPy:

 NumPy는 Python에서 수치 연산을 수행하기 위한 핵심 라이브러리다. 고성능의 다차원 배열 객체, 그리고 이 배열을 다루기 위한 다양한 함수와 도구를 제공한다. 파이썬의 list보다 속도가 빠르고, 적은 메모리를 사용한다.

NumPy는 데이터 분석, 과학적 컴퓨팅 및 기계 학습과 같은 많은 분야에서 널리 사용된다.

 

 Numpy  설치하고 기능을 사용하기 위해 받아오기

# 설치하기
!pip install numpy
# import 하기
import numpy

 

 np라는 약자로 numpy를 import 해오면 Numpy라이브러리를 쉽게 호출해 사용할 수 있다. np는 Numpy에 대한 약어다!
(import는 한번만 하면 되는데 나는 import numpy as np 구문을 사용할거임)

# import 하기 2
import numpy as np

 

 


1-1. ndarray (다차원 배열):

 NumPy의 `ndarray`는 NumPy의 핵심 개체이다. `ndarray`는 동일한 유형의 원소로 구성된 n차원 배열을 나타낸다. 이 배열은 메모리 상에 연속적으로 배치되어 있어 요소에 대한 효율적인 접근과 다차원 데이터의 표현과 조작이 가능하다. `ndarray`는 다양한 모양(shape)과 차원(dimension)을 가질 수 있으며, 배열의 크기 및 모양은 수정 가능하다.

# ndarry = n dimention array

 

 ▼다차원 배열 예시: list2

list1 = [1,2,3,4]
list2 = [[1,2,3,4], [5,6,7,8]]

print(list1)   #[1, 2, 3, 4]
print(list2)   #[[1, 2, 3, 4], [5, 6, 7, 8]]
print(type(list1))   #<class 'list'>
print(type(list1[1]))   #<class 'int'>
print(type(list2))   #<class 'list'>

 

  ▼Numpy를 사용하여 1차원 배열(ndarr1)을 생성하고, 배열의 내용과 데이터 타입을 출력하는 예제

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

np.array([1,2,3,4]): Numpy의 array함수를 사용하여 [1,2,3,4]라는 리스트를 Numpy배열로 변환한다.

이렇게 생성된 배열은 ndarr1 변수에 할당된다. 

 

# 리스트를 ndarray로 변환하는 방법
ndarr1= np.array(list1)
ndarr2 = np.array(list2)

print(ndarr1)   #[1 2 3 4]
print(ndarr2)   #[[1 2 3 4], [5 6 7 8]]
print(type(ndarr1))   #<class 'numpy.ndarray'>
print(type(ndarr2))   #<class 'numpy.ndarray'>

 


1-2. ndarray의 데이터 유형(datatype):

`ndarray`는 다양한 데이터 유형을 지원한다. 배열의 원소는 정수, 부동 소수점, 복소수, 불리언 값 등이 될 수 있다.  그러나 ndarray는 list 와 다르게 한 리스트에 1개의 단일 데이터 타입만 허용한다.

데이터 유형은 `dtype` 속성을 통해 확인하고 설정할 수 있으며, 배열이 소비하는 메모리의 양과 배열에 적용되는 연산의 종류에 영향을 준다.

 

 

▼list

list1= [1, 3.14, 'Python', '✨💖', True]  
# list의 경우 다양한 타입이 저장됨

list1   #[1, 3.14, 'Python', '✨💖', True]
# 출력시에도 그대로 다양한 타입이 출력됨

list1[3]   # '✨💖'

 

 

▼ndarray

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

 

int와 float 두가지 타입을 넣었을 경우 

ndarr2 = np.array([1,2,3.14, 4])
ndarr2   #array([1.  , 2.  , 3.14, 4.  ])
# 모든 요소가 다 float화 되어있음!!

 

# intfloat, 그리고 Boolean 타입을 넣었을 경우 

ndarr3 = np.array([[1,2,3.14, True]])
ndarr3   # array([[1.  , 2.  , 3.14, 1.  ]])
# 역시 모든 요소가 float화! 세가지 타입 중 가장 큰 요소값에 맞춤

 

# intfloat, Boolean, 그리고 string타입을 넣었을 경우 

ndarr4 = np.array(['1',2,3.14,True])
ndarr4   #array(['1', '2', '3.14', 'True'], dtype='<U32')
# 여기서는 string형이 가장 크기가 크기 때문에 전부 string형으로 바뀜

 

# 전체 타입을  int로 변경

ndarr4=np.array(['1',2,3.14, True], dtype=int)
ndarr4   #array([1, 2, 3, 1])
# 따옴표를 떼고 int면 숫자형으로 변환 가능!
ndarr4=np.array(['1','2','3.14', 'True'], dtype=int)
# 따옴표를 뗀 형태가 int가 아닌 요소들이 포함되어있기 때문에 타입변환 불가. 에러가 남!

 


1-3. ndarray 슬라이싱:

 NumPy 배열은 슬라이싱을 통해 배열의 일부분에 접근하고 조작할 수 있다. 슬라이싱은 배열의 원소에 접근하는 효율적인 방법으로, 배열의 일부분을 선택하거나 변경할 수 있다. 슬라이싱은 인덱스를 사용하여 배열의 원소 범위를 지정하고 조작할 수 있다.

 

ndarr1 = np.array(['🍓', '🍒','🍋', '🍉', '🍎'])
ndarr1  # array(['🍓', '🍒', '🍋', '🍉', '🍎'], dtype='<U1')

 

# 모양 찍어보기

ndarr1.shape
# (5,)

결과가 (5,) 로 나옴. 1차원 데이터에 5개의 요소가 들어있다는 의미!

 

 

# 인덱싱

print(ndarr1[0])
print(ndarr1[3])
print(ndarr1[-1])

#🍓
#🍉
#🍎

 

 

# 슬라이싱

print(ndarr1[0: 3])
print(ndarr1[2: ])
print(ndarr1[ :3])

#['🍓' '🍒' '🍋']
#['🍋' '🍉' '🍎']
#['🍓' '🍒' '🍋']

 

 

# 2차원 배열 만들고 모양 찍어보기

ndarr2d = np.array([[1,2,3,4], 
                    [5,6,7,8], 
                    [9,10,11,12]])
ndarr2d.shape  #(3, 4)

결과가 (3, 4)로 나옴. 2차원 배열이며 3행 4열임을 알 수 있다.

 

# 2차원 배열 인덱싱

print(ndarr2d[0, 2])
print(ndarr2d[[0],[2]])

#3
#[3]

 

 

대괄호가 왜 있나 둘의 차이가 궁금하쥬?

  1.  첫번째 출력문인 print(ndarr2d[0, 2])에서는 ndarr2d의 0번째 행과 2번째 열에 위치한 원소를 출력하고 있다. 인덱싱은 0부터시작하기 때문에 ndarray 의 0번째 행은 [1, 2, 3, 4, ] 이고, 2번째열은 3이므로 3이 출력된다!
  2. 두번째 출력문인 print(nadrr2d[0],[2]) 에서는 ndarr2d의 0번째 행과 2번째 열에 해당하는 원소를 출력하고 있다. Numpy에서 대괄호를 사용하여 인덱스를 지정하면 해당 위치에있는원소를반환한다. 여기서는 0번째 행에 2번째열을 선택하는것은 같지만 선택된 원소를 1차원 배열 형태로 반환하기 때문에 [3]의 모양으로 출력되는것이다!   

요약하자면 print(ndarr2d[0, 2])은 2차원 배열에서 원소하나를 선택하여 출력하는 것이고,   print(nadrr2d[0],[2]) 에서는 해당 위치의 원소를 1차원 배열로 반환하는 것이다. 

 

 

 

# 0번째 행 가져오기 

print(ndarr2d[0])
print(ndarr2d[0,])
print(ndarr2d[0, :])  # : 이 전체를 가져오라는 뜻

# 셋 다 결과가  [1 2 3 4]로 같게 나옴

 

# 0번째 열 가져오기

print(ndarr2d[: ,0])  
print(ndarr2d[2 ,0]) 

# [1 5 9]
# 9

첫번째 출력문은 (행 전체에서, 0번째 열) 을 가져와라 라는 뜻

두번째 출력문은 (2번째 행에서. 0번째열)을 가져와라 라는 뜻

 

 


1-4. Fancy 인덱싱:


 Fancy 인덱싱은 NumPy 배열의 특정 위치에 접근하고 조작하기 위한 고급 인덱싱 방법이다. Fancy 인덱싱은 정수 배열 또는 불리언 배열을 사용하여 배열의 원소를 선택하거나 재정렬할 수 있다. 이를 통해 배열의 원소에 대한 복잡한 조작을 수행할 수 있다.

 범위가 아니라 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 사용한다!

 

# 먼저 1차원 배열 하나 만들어주기 

ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32]

# 그다음 인덱스 배열 만들어주기

idx = [2, 5, 9 ]

# ndarr1 배열에서 idx리스트에 포함된 인덱스들에 해하는 원소 선택하기

ndarr1[idx]
# array([ 2, 90, 32])

 

 

# 이번에는 2차원 배열 만들어주기

ndarr2d = np.array([[1,2,3,4], 
                    [5,6,7,8], 
                    [9,10,11,12]])

# 0행과 1행 만 전부 가져오기 

ndarr2d[[0,1], :] 

# array([[1, 2, 3, 4],
#       [5, 6, 7, 8]])

 

 


1-5. Boolean 인덱싱:


 Boolean 인덱싱은 조건에 따라 배열의 원소를 선택하는 방법이다. 조건에 대한 평가 결과가 True인 위치에 해당하는 원소를 선택하거나 조작할 수 있다. 이를 통해 특정 조건을 만족하는 배열의 원소를 필터링하거나 조작할 수 있다. Boolean 인덱싱은 데이터 필터링과 마스킹 작업에 유용하다!

 

# 배열과 리스트 만들기

ndarr1 = np.array(['🍓', '🍒','🍋', '🍉', '🍎'])
selValue = [True, False, True, True, False]

위의 selValue리스트는 불리언값으로 이루어진 리스트로, ndarr1배열에서 선택할 원소를지정하는 마스크 역할을 한다. 

True 에 해당하는 인덱스의 원소는 선택되고, False에 해당하는 인덱스의 원소는 선택되지 않는다. 

 

# ndarr1배열에서  selValue리스트에 대응하는 원소들을 선택한다. (True에 해당하는 인덱스에 있는 원소들을 선택)

ndarr1[selValue]
# array(['🍓', '🍋', '🍉'], dtype='<U1')

 

리스트 길이가 안맞는 경우에는 에러가 뜨니까 배열 길이와 리스트 길이를 맞춰야함!

 

 

# 2차원 배열 만들기

ndarr2d = np.array([[1,2,3,4], 
                    [5,6,7,8], 
                    [9,10,11,12]])
ndarr2d.shape
# (3, 4)

3행 4열임을 알 수 있다

 

ndarr2d > 7
#array([[False, False, False, False],
#      [False, False, False,  True],
#      [ True,  True,  True,  True]])

ndarr2d배열의 요소 중 7보다 큰것을 출력하면, 7보다 큰 요소만 나오는 것이 아니라  boolean타입의 배열이 나온다.

만약 boolean타입 배열이 아니라 7보다 큰 요소들만 뽑아서 보고싶다면 아래와 같이 하면 된다.

ndarr2d[ndarr2d > 7]
# array([ 8,  9, 10, 11, 12])

 

'KDT 수업 > Python' 카테고리의 다른 글

[데이터분석] Pandas 판다스-1  (2) 2023.06.09
[데이터분석] 행렬연산  (0) 2023.06.08
28. DB를 이용한 단어장 만들기  (0) 2023.03.22
27. 파이썬과 MySQL 연동  (0) 2023.03.22
26. DAO, DTO, VO  (0) 2023.03.22