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. ]])
'AI인공지능 by Python > 3. 데이터 분석' 카테고리의 다른 글
| [ AI 인공지능 ] ② 판다스(Pandas) _ 2 (0) | 2023.03.27 |
|---|---|
| [ AI 인공지능 ] ② 판다스(Pandas) _ 1 (0) | 2023.03.21 |