본문 바로가기

데이터 분석

1. 넘파이(Numpy)

넘파이(Numpy)

  • 수학, 과학 계산용 패키지
  • 자료구조(ndarray)를 제공 -> 파이썬의 list보다 속도가 빠름, 적은 메모리를 사용

 

numpy 설치

!pip install numpy

 

numpy import

import numpy

 

numpy 라이브러리 위치

print(numpy)

 


ndarray

  • NumPy의 자료구조 클래스
  • "n-차원 배열"을 의미함
  • 벡터, 행렬 또는 고차원 텐서와 같은 모든 차원의 배열을 나타내고 연산을 수행하는 방법을 제공함

 

- list

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

# list1 출력
print(list1) # [1, 2, 3, 4]

# list2 출력
print(list2) # [[1, 2, 3, 4], [5, 6, 7, 8]]

# list1의 타입 출력
print(type(list1)) # <class 'list'>

# list1의 인덱스 0 의 요소 출력
print(type(list1[0])) # <class 'int'>

# list2의 타입 출력
print(type(list2)) # <class 'list'>

 

- ndarray 선언

import numpy as np

ndarray명 = np.array([값1, 값2, ...])

 

- ndarray 출력

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

# ndarr1 출력
print(ndarr1) # [1 2 3 4]

# ndarr1의 타입 출력
print(type(ndarr1)) # ndarray = n dimension array

 

- 리스트를 ndarray로 변환하는 방법

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

# list1를 ndarray로 변환
ndarr1 = np.array(list1)

# list2를 ndarray로 변환
ndarr2 = np.array(list2)

# ndarr1 출력
print(ndarr1) # [1 2 3 4]

# ndarr2 출력
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'>

 

ndarray의 data type

  • ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용
list1 = [1, 3.14, "python", "😎", True]

print(list1) # [1, 3.14, 'python', '😎', True]
print(list1[3]) # 😎

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

print(ndarr1) # array([1, 2, 3, 4])

ndarr2 = np.array([1,2,3.14,4]) # 모든 요소가 float로 변경됨

print(ndarr2) # array([1.  , 2.  , 3.14, 4.  ])

ndarr3 = np.array([1,2,3.14, True]) # 모든 요소가 float로 변경됨

print(ndarr3) # array([1.  , 2.  , 3.14, 1.  ])

ndarr4 = np.array(["1",2,3.14, True]) # 모든 요소가 string로 변경됨

print(ndarr4) # dtype='<U32' 유니코드 데이터 타입
# array(['1', '2', '3.14', 'True'], dtype='<U32')

print(type(ndarr4)) # numpy.ndarray

 

data type 설정하기

 

ndarr3 = np.array([1,2,3.14, True], dtype=int) # datatype을 int로 설정

print(ndarr3) # array([1, 2, 3, 1])

ndarr4 = np.array(["1",2,3.14, True], dtype=int) # datatype을 int로 설정

print(ndarr4) # array([1, 2, 3, 1])

 

ndarr5 = np.array(["1",2,"3.14", True], dtype=int) # 3.14를 바꾸지 못하기 때문에 ValueError

 

ndarray 슬라이싱

ndarr1 = np.array(['🍒','🍑','🍐','🍏'])
ndarr1 # array(['🍒', '🍑', '🍐', '🍏'], dtype='<U1')

# shape : ndarray에 저장되어있는 행렬을 보여줌
ndarr1.shape # (4,)

# 인덱싱
print(ndarr1[0]) # 🍒
print(ndarr1[3]) # 🍏
print(ndarr1[-1]) # 🍏
print(ndarr1[-2]) # 🍐

# 슬라이싱
print(ndarr1[0:3]) # ['🍒' '🍑' '🍐']
print(ndarr1[1:]) # ['🍑' '🍐' '🍏']
print(ndarr1[:3]) # ['🍒' '🍑' '🍐']

 

2차원 ndarray 슬라이싱

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

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

# 0행 가져오기
print(ndarr2d[0]) # [1 2 3 4] 자주 사용하는 방법
print(ndarr2d[0,]) # [1 2 3 4] 
print(ndarr2d[0,:]) # [1 2 3 4] 자주 사용하는 방법

# 0열 가져오기
# 앞의 행은 다 가져오고 , 0열을 가져옴
print(ndarr2d[:,0]) # [1 5 9]

 

Fancy 인덱싱

  • 범위가 아닌 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 활용
ndarr1 = np.array([10,15,2,8,20,90,85,44,23,32])

idx = [2, 5, 9]

# 인덱스의 넣는 숫자
ndarr1[idx] # array([ 2, 90, 32])

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

 

Boolean 인덱싱

  • 조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용
ndarr1 = np.array(['🍒','🍑','🍐','🍏','🍕'])
selValue = [True, False, True, True, False]

# 중요! True인것만 뽑힘
ndarr1[selValue] # array(['🍒', '🍐', '🍏'], dtype='<U1')

selValue = [True, False, True]

ndarr1[selValue] # 숫자가 맞지 않기 때문에 IndexError 발생!

 

ndarr2d = np.array([[1,2,3,4], 
                    [5,6,7,8], 
                    [9,10,11,12]])
                    
ndarr2d > 7 #boolean화가 되어 7보다 큰 값들만 True로 표현
'''
array([[False, False, False, False],
       [False, False, False,  True],
       [ True,  True,  True,  True]])
'''
# 7보다 큰 값들만 뽑기 
ndarr2d[ndarr2d > 7] # array([ 8,  9, 10, 11, 12])

 


행렬 연산

 

연산자

  • 덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야 함
  • 같은 postition끼리 연산
  • 내적(dot product)은 맞닿는 shape가 같아야 함
  • 내적은 떨어져 있는 shape가 결과 행렬이 됨
a = np.array([[1,2,3],
             [2,3,4]])
b = np.array([[3,4,5],
             [1,2,3]])

a.shape, b.shape # ((2, 3), (2, 3))

# 덧셈연산
a + b

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

# 뺄셈 연산
a - b
'''
array([[-2, -2, -2],
       [ 1,  1,  1]])
'''

# 곱셈 연산
a * b
'''
array([[ 3,  8, 15],
       [ 2,  6, 12]])
'''

# 나눗셈 연산
a / b
'''
array([[0.33333333, 0.5       , 0.6       ],
       [2.        , 1.5       , 1.33333333]])
'''

 

dot product(행렬곱, 내적)

  • 영상관련 딥러닝할때 많이 쓰임
a = np.array([[1,2,3],
              [1,2,3],
              [2,3,4]])

b = np.array([[1,2],
              [3,4],
              [5,6]])
              
a.shape, b.shape # ((3, 3), (3, 2))

print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6)) # 22 28
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6)) # 22 28
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6)) # 31 40

np.dot(a,b)
'''
array([[22, 28],
       [22, 28],
       [31, 40]])
'''

 

arange

  • 순차적인 값을 생성할 때 사용
arr1 = range(1, 11)

arr1 # range(1, 11)

for i in arr1:
    print(i, end=' ')
# 1 2 3 4 5 6 7 8 9 10 

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

for i in arr2:
    print(i, end=' ')  
# 1 2 3 4 5 6 7 8 9 10

 

sort

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

np.sort(ndarr1) # array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
ndarr1 # array([ 1, 10,  5,  7,  2,  4,  3,  6,  8,  9])

np.sort(ndarr1, reverse=True) # reverse 속성이 없기 때문에 에러!
# 문자열 역순으로 출력하기
str1 = 'Python'

# 모든 문자를 슬라이싱
print(str1[:]) # Python

# print(str1[::1]) -> 1: 정방향
print(str1[::]) # Python

# print(str1[::-1]) -> -1 :역방향
print(str1[::-1]) # nohtyP

# 4번 인덱스부터 1직전까지 역순으로 가져오기
print(str1[4:1:-1]) # oht

# 4번 인덱스부터 0까지 역순으로 가져오기
print(str1[4::-1]) # ohtyP

# 내림차순 정렬
np.sort(ndarr1)[::-1] # array([10,  9,  8,  7,  6,  5,  4,  3,  2,  1])

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

# 행 정렬(axis=0)
np.sort(ndarr2d, axis=0)
'''
array([[ 3,  1,  4,  2],
       [ 5,  6,  7,  8],
       [11, 10, 12,  9]])
'''

# 열 정렬(axis=1)
np.sort(ndarr2d, axis=1)
'''
array([[ 9, 10, 11, 12],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])
'''

# 행 내림차순 정렬
np.sort(ndarr2d, axis=1)[:,::-1]
'''
array([[12, 11, 10,  9],
       [ 4,  3,  2,  1],
       [ 8,  7,  6,  5]])
'''

# 축의 마지막 방향
np.sort(ndarr2d, axis=-1)
'''
array([[ 9, 10, 11, 12],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])
'''

 

숫자의 단일 연산

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

# 모든 요소에 3을 더함
a+3
'''
array([[4, 5, 6],
       [7, 8, 9]])
'''

# 모든 요소에 3을 뺌
a-3
```
array([[-2, -1,  0],
       [ 1,  2,  3]])
```

# 모든 요소에 3을 곱함
a*3
'''
array([[ 3,  6,  9],
       [12, 15, 18]])
'''

# 모든 요소에 3을 나눔
a/3
'''
array([[0.33333333, 0.66666667, 1.        ],
       [1.33333333, 1.66666667, 2.        ]])
'''

b = np.array([[3,3,3],
             [3,3,3]])
             
# ndarray끼리 덧셈
a+b
'''
array([[4, 5, 6],
       [7, 8, 9]])
'''

'데이터 분석' 카테고리의 다른 글

2-4. 결측값(Null, NaN)  (0) 2023.06.08
2-3. 데이터 다루기  (0) 2023.06.08
2-2. 데이터 프레임의 기본 정보  (0) 2023.06.01
2-1. CSV 파일 다루기  (0) 2023.05.31
2. Pandas(판다스)  (0) 2023.05.29