본문 바로가기

AI인공지능 by Python/3. 데이터 분석

[ AI 인공지능 ] ① 넘파이(Numpy)

1. Numpy

  • 수학, 과학 계산용 패키지
  • 자료구조 : ndarray
    • 파이썬의 list보다 빠름
    • 적은 메모리를 사용
!pip install numpy

> Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/ Requirement already satisfied: numpy in /usr/local/lib/python3.9/dist-packages (1.22.4)

import numpy

numpy

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

import numpy as np

np

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

 

1-1. ndarray

list1 = [1,2,3,4]
list2 = [[1,2,3,4],[5,6,7,8]]
print(list1)
print(list2)
print(type(list1))
print(type(list2))

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

ndarr1 = np.array([1,2,3,4])
print(ndarr1)
print(type(ndarr1)) # nuimpy.ndarray = n dimension array

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

 

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

ndarr1 = np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1)
print(type(ndarr1))
print(ndarr2)
print(type(ndarr2))

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

 

1-2. ndarray의 data type

  • ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용
list1 = [1,3.14,'Python','😊', True]
print(list1)

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

list1[3]

> '😊'

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

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

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

ndarr2

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

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

ndarr4

> array(['1', '2', '3', '3.14', 'True', 'apple'], dtype='<U32')

type(ndarr4)
type(ndarr4[0])

> numpy.ndarray

> numpy.str_

ndarr2 = np.array([1,2,3,3.14,4], dtype = int)
ndarr2

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

# ndarr4 = np.array([1,2,3,3.14, True, 'apple'], dtype = int)
# ValueError: invalid literal for int() with base 10: 'apple'

 

ndarr5 = np.array([1,2,3,3.14,True,'1234'], dtype=int)
ndarr5

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

 

1-3. ndarray 슬라이싱

ndarr1 = np.array(['😊','😂','😍','😎','🤩'])
ndarr1.shape

> (5,)

 

✔️ 인덱싱

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

> 😊
> 🤩
> 🤩
> 😎

 

✔️ 슬라이싱

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

> ['😊' '😂' '😍']
> ['😍' '😎' '🤩']
> ['😊' '😂' '😍']

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

> (3, 4)

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

> 3

> 10

 

✔️ 0행을 가져오기 

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

> [1 2 3 4] -> 3개 모두 같은 결과

 

✔️ 0열 가져오기

print(ndarr2d[:,0])

> [1, 5, 9]

print(ndarr2d[:2,:])

> [[1 2 3 4]
     [5 6 7 8]]

 

1-4. Fancy 인덱싱

  • 범위가 아닌 특정 index의 집합의 값을 선택하여 추출하고 싶을 때 활용
ndarr1 = np.array([10, 23, 2, 6, 90, 85, 32, 66, 80])
idx = [1,4,6]
ndarr1[idx]

> array([23, 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]])

 

1-5. Boolean 인덱싱

  • 조건 필터링을 통하여 Boolean값을 이용한 색인
ndarr1 = np.array(['😊','😂','😍','😎','🤩'])
selValue = [True, True, False, False, True]

ndarr1[selValue]

> array(['😊', '😂', '🤩'], dtype='<U1')

selValue = [True, True, False]
# ndarr1[selValue]
# IndexError: boolean index did not match indexed array along dimension 0; 
# 	      dimension is 5 but corresponding boolean dimension is 3
# 개수가 맞아야함

 

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

> array([[False, False, False, False],
                  [False,  True,  True,  True],
                  [ True,  True,  True,  True]])

ndarr2d < 7

> array([[ True,  True,  True,  True],
                  [ True,  True, False, False],
                  [False, False, False, False]])

ndarr2d[ndarr2d < 7]

> array([1, 2, 3, 4, 5, 6])

 

2. 행렬연산

 

2-1. 연산자

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

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

✔️ 덧셈 연산

  • shape가 같아야 함
  • 같은 position끼리 연산
a + b

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

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

b = np.array([[3,4],
             [1,2]])
             
# a + b
# ValueError: operands could not be broadcast together with shapes (2,3) (2,2)

 

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

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

✔️ 뺄셈 연산

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))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))

> 22 28
> 22 28
> 31 40

np.dot(a, b)

> array([[22, 28],
                 [22, 28],
                 [31, 40]])

 

2-2. arrange

  • 순차적인 깂을 생성할 때 사용
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 

 

2-3. 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 속성이 없다!

np.sort(ndarr1)[::-1]

> array([10,  9,  8,  7,  6,  5,  4,  3,  2,  1])

 

✔️ 문자열 역순으로 출력하기

s = 'pyhton'

🔸3번 인덱스부터 0 직전까지 역순으로 1개씩 가져오기

print(s[3:0:-1])

> thy

 

🔸3번 인덱스부터 0까지 역순으로 1개씩 가져오기

print(s[3::-1])

> thyp

 

🔸마지막부터 0까지 역순으로 1개씩 가져오기

print(s[::-1])

> nothyp

 

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

> (3, 4)

 

✔️ 행 정렬

np.sort(ndarr2d, axis = 0)

> array([[ 3,  1,  4,  2],
                 [ 5,  6,  7,  8],
                 [11, 10, 12,  9]])

 

✔️ 열 정렬

np.sort(ndarr2d, axis = 1)

> array([[ 9, 10, 11, 12],
                 [ 1,  2,  3,  4],
                 [ 5,  6,  7,  8]])

 

✔️ 축의 마지막 방향

np.sort(ndarr2d, axis = -1)

> array([[ 9, 10, 11, 12],
                 [ 1,  2,  3,  4],
                 [ 5,  6,  7,  8]])

 

2-4. 숫자의 단일 연산

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

a + b

> array([[4, 5, 6],
                 [7, 8, 9]])

a + 3

> array([[4, 5, 6],
                 [7, 8, 9]])

a - 3

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

a * 3

> array([[ 3,  6,  9],
                 [12, 15, 18]])

a / 3

> array([[0.33333333, 0.66666667, 1.        ],
                 [1.33333333, 1.66666667, 2.        ]])