본문 바로가기
Python/Data Analysis

[파이썬, Python] Numpy 모듈 - 1️⃣ 넘파이 모듈, ndarray 다루기(인덱싱, 슬라이싱)

by coding-choonsik 2023. 5. 18.
728x90
반응형
SMALL

1. 넘파이(Numpy)

  • 수학, 과학 계산용 패키지
  • 성능 : 파이썬의 리스트보다 빠름
  • 메모리 사이즈: 파이썬의 리스트보다 적은 메모리를 사용
  • 빌트인 함수: 선형대수, 통계관련 여러 함수들을 내장

 

1-1. Numpy 설치하기

!pip install numpy

 

1-2. Numpy import하기

import numpy
import numpy as np  # 별칭 사용

 

1-3. 설치 디렉토리 확인하기

  • 설치되어있는 위치
  • 코랩에서 깔았기 때문에 현재는 마음대로 지울 수 없지만 자기 컴퓨터에서 라이브러리, 모듈을 설치 후 삭제해야할 경우가 있기 때문에  디렉토리를 확인해야함
numpy

>>> <module 'numpy' from '/usr/local/lib/python3.10/dist-packages/numpy/__init__.py'>

2. ndarray(n dimension array)

  • 다차원 배열
  •  ndarray는 생성될 때 크기가 결정
  • 데이터를 메모리 내에서 연속적으로 저장하므로 빠른 계산이 가능
  • 동일한 데이터 타입을 가지는 요소들로 구성되어야 함
  • 다차원 배열에 대한 다양한 수학적 연산을 지원

 

2-1. list & ndarray의 비교

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


>>> [1, 2, 3, 4]
[[1, 2, 3, 4], [5, 6, 7, 8]]
<class 'list'>
<class 'int'>
<class 'list'>

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

>>> [1 2 3 4]
<class 'numpy.ndarray'>

 

2-2. list를 ndarray로 변환

ndarr1 = np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1)
print(ndarr2)  # 2차원 
print(type(ndarr1))
print(type(ndarr2))

>>> [1 2 3 4]
[[1 2 3 4]
 [5 6 7 8]]
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>

 

2-3. ndarray의 데이터 타입

# list
list1 = [1, 3.14, 'Python', '😎', True]   # 다양한 데이터타입을 리스트에 저장할 수 있음
print(list1)
lisst1[3]


>>> [1, 3.14, 'Python', '😎', True]
'😎'


# ndarray
ndarr1 = np.array([1, 2, 3, 4])
ndarr2 = np.array([1, 2, 3.14, 4])
print(ndarr1)
print(ndarr2)   #자동 형변환(모든 요소가 float형으로 바뀜)

>>> array([1, 2, 3, 4])
array([1.  , 2.  , 3.14, 4.  ])  



ndarr3 = np.array([1, 2, 3.14, True])
print(ndarr3)   # 가장 큰 데이터타입인 float형으로 모든 요소가 바뀜(Bool은 데이터타입이 가장 작음!!)

>>> array([1.  , 2.  , 3.14, 1.  ])

ndarr4 = np.array(["1", 2, 3.14, True])
print(ndarr4)  # str이 데이터타입이 가장 큼(모든 요소가 str형으로 바뀜)

# dtype='<U32': 데이터(요소들)의 타입, 데이터타입이 유니코드32 타입
>>> array(['1', '2', '3.14', 'True'], dtype='<U32')


ndarr5= np.array([1,2,3.14, True], dtype=int)
print(ndarr5)    # dtype요소들 모두 int로 바뀜!, float형은 소수점뒤를 빼고 정수만 남음

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

ndarr6 = np.array(['1',2,3.14, True], dtype=int)
print(ndarr6)    # 따옴표를 떼고 숫자였을 때 int형으로 바꿀 수 있음!

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

# invalid literal for int() with base 10: '3.14' -> 따옴표를 떼고 float형일 때 int로 변환할 수 없음!
ndarr7 = np.array(['1','2','3.14', 'True'], dtype=int)

3. ndarray 다루기

 

3-1. ndarray 인덱싱

1)  1차원 array

ndarr1 = np.array(['🥝', '🍋','🍈','🍊','🍉'])
print(ndarr1) 

>>> array(['🥝', '🍋', '🍈', '🍊', '🍉'], dtype='<U1')

ndarr1.shape     # (5,): 5행(5개의 데이터가 있음)
>>> (5,)


print(ndarr1[0])
print(ndarr1[4])
print(ndarr1[-1])   
print(ndarr1[-2])   

>>> 🥝
🍉
🍉
🍊

2) 2차원 array

ndarr2d = np.array([[1,2,3,4], 
                    [5,6,7,8], 
                    [9,10,11,12]])
ndarr2d.shape   #(3, 4) : 3행 4열(2차원 배열
>>> (3, 4)


print(ndarr2d[0,2])    # 3: 0행 2열
print(ndarr2d[0][2])   # 3: 0행 2열
>>> 3
3

3-2. Fancy 인덱싱

  • 범위가 아닌 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 활용 
ndarr1 = np.array([10, 140, 2, 8, 20, 6, 99, 45, 26, 63])
idx = [2, 5, 8]

ndarr1[idx]   #ndarr1[[2,5,8]]
>>> array([ 2,  6, 26])


ndarr2d = np.array([[1,3,6,7], 
                    [5,6,7,8], 
                    [9,4,0,1]])
                    
ndarr2d[[0, 1], :]   # 0과 1행, 모든 열

>>> array([[1, 3, 6, 7],
       [5, 6, 7, 8]])

3-3. Boolean 인덱싱

  • 조건에 대한 필터링을 통해 Boolean값을 이용한 색인을 사용하는 방법 

 

1) 1차원 array

ndarr1 = np.array(['🥝', '🍋','🍈','🍊','🍉'])
selValue=[True, False, True, True, False]  

ndarr1[selValue]
>>> array(['🥝', '🍈', '🍊'], dtype='<U1')



selValue2 = [True, False]
# ndarr1[selValue2]    # IndexError: Boolean Value는 array 요소의 개수와 꼭 같아야함!!

2) 2차원 array

ndarr2d = np.array([[1,3,6,7], 
                    [5,6,7,8], 
                    [9,4,0,1]])
                    
ndarr2d > 7   # 데이터가 boolean화 된 배열로 반환
>>> array([[False, False, False, False],
       [False, False, False,  True],
       [ True, False, False, False]])
       
       
ndarr2d[ndarr2d > 7]   #boolean이 True인 값들만 나오게 됨
>>> array([8, 9])

3-4. ndarray 슬라이싱

 

ndarr1 = np.array(['🥝', '🍋','🍈','🍊','🍉'])

ndarr1
>>> array(['🥝', '🍋', '🍈', '🍊', '🍉'], dtype='<U1')

ndarr1.shape   # (5,): 5행(5개의 데이터가 있음)
>>> (5,)


# 슬라이싱
print(ndarr1[0:3])   # 인덱스 0번부터 3이되기 직전까지(2번인덱스까지)
print(ndarr1[1:-1])  # 인덱스 1번부터 끝에서 1번째 인덱스 전까지
print(ndarr1[2:])	 # 인덱스 2번부터 끝까지
print(ndarr1[:3])	 # 처음부터 인덱스번호 3번까지

>>> ['🥝' '🍋' '🍈']
['🍋' '🍈' '🍊']
['🍈' '🍊' '🍉']
['🥝' '🍋' '🍈']


# 원하는 행과 열 가져오기
# 0번째 행 가져오기
print(ndarr2d[0])
print(ndarr2d[0, ])
print(ndarr2d[0, :])   # 0행의 모든 열

>>> [1 2 3 4]
[1 2 3 4]
[1 2 3 4]


# 0번째 열 가져오기
print(ndarr2d[:, 0])
>>> [1 5 9]

 

 

 

 

728x90
반응형
LIST