일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- decode()
- fileinput
- inplace()
- __len__
- randrange()
- JS
- shutil
- count()
- View
- choice()
- MySQL
- 오버라이딩
- fnmatch
- mro()
- HTML
- remove()
- CSS
- __sub__
- discard()
- MySqlDB
- Database
- items()
- node.js
- 파이썬
- __getitem__
- zipfile
- __annotations__
- shuffle()
- glob
- locals()
- Today
- Total
흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)
(Python) Numpy 본문
1. 넘파이(Numpy)
- 수학, 과학 계산용 패키지
- 자료구조(ndarray)를 제공 -> 파이썬의 list보다 속도가 빠름. 작은 메모리를 사용
!pip install numpy
import numpy
import numpy as np
1-1. ndarray
ndarray를 선언할 때는 리스트를 array메소드에 매개변수롤 받아 선언한다.
ndarr1 = np.array([1, 2 ,3 ,4])
print(ndarr1)
print(type(ndarr1)) # ndarray = n dimension array
[1 2 3 4]
<class 'numpy.ndarray'>
# 리스트를 ndarray로 변환하는 방법
ndarr1 = np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1)
print(ndarr2)
print(type(ndarr1))
print(type(ndarr2))
[1 2 3 4]
[[1 2 3 4]
[5 6 7 8]]
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
1-2. ndarray의 data type
- ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용
리스트는 서로 다른 데이터 타입을 허용하는 것을 확인 할 수 있다.
list1 = [1, 3.14, 'Python', '😎', True]
[1, 3.14, 'Python', '😎', True]
ndarray는 데이터 타입이 같을 경우 문제없이 생성이 되지만
ndarr1 = np.array([1, 2, 3, 4])
array([1, 2, 3, 4])
ndarr2 = np.array([1, 2, 3.14, 4]) # 모든 요소가 float로 변경됨
array([1. , 2. , 3.14, 4. ])
ndarr3 = np.array([1, 2, 3.14, True]) # 모든 요소가 float로 변경됨
array([1. , 2. , 3.14, 1. ])
만약 str 타입이 있을 경우는 나머지 값들이 모두 str로 변환 된다.
ndarr4 = np.array(['1', 2, 3.14, True]) # 모든 요소가 str로 변경됨
array(['1', '2', '3.14', 'True'], dtype='<U32')
ndarr3 = np.array([1, 2, 3.14, True], dtype=int)
array([1, 2, 3, 1])
ndarr4 = np.array(['1', 2, 3.14, True], dtype=int)
array([1, 2, 3, 1])
ndarr4 = np.array(['1', '2', '3.14', 'True'], dtype=int) # 문자열로 되어있는 3.14는 int 변환 불가능
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-27-1dd367754309> in <cell line: 1>()
----> 1 ndarr4 = np.array(['1', '2', '3.14', 'True'], dtype=int)
ValueError: invalid literal for int() with base 10: '3.14'
1-3. ndarray 슬라이싱
ndarr1 = np.array(['🍓', '🍉', '🍎', '🍊', '🍌'])
ndarr1
array(['🍓', '🍉', '🍎', '🍊', '🍌'], dtype='<U1')
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[0][2])
3
3
# 0행 가져오기
print(ndarr2d[0])
print(ndarr2d[0,])
print(ndarr2d[0,:])
[1 2 3 4]
[1 2 3 4]
[1 2 3 4]
열을 가져올 경우에는 행의 범위와 열의 범위 전부 적어야 한다.
# 0열 가져오기
print(ndarr2d[:, 0])
[1 5 9]
1-4. 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]])
아래는 0번째와 1번째 행을 가져오는 방법이다.
ndarr2d[[0, 1], :]
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
1-5. Boolean 인덱싱
- 조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용
ndarr1 = np.array(['🍓', '🍉', '🍎', '🍊', '🍌'])
selValue = [True, False, True, True, False]
ndarr1[selValue]
array(['🍓', '🍎', '🍊'], dtype='<U1')
하지만 행의 갯수가 일치하지 않으면 에러가 발생한다.
selValue = [True, False, True]
ndarr1[selValue] # 행 갯수가 맞지 않으면 Error
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-56-3365a515ea60> in <cell line: 1>()
----> 1 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]])
ndarray에 관계연산자를 사용하면 ndarray로 결과값이 반환된다.
ndarr2d > 7
array([[False, False, False, False],
[False, False, False, True],
[ True, True, True, True]])
위를 응용하면 ndarray의 관계 연산자를 이용한 값을 사용하여 boolean 인덱싱을 할 수 있다.
ndarr2d[ndarr2d > 7]
array([ 8, 9, 10, 11, 12])
2. 행렬 연산
2-1. 연산자
- 덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야 함
- 같은 position끼리 연산
- 내적은 맞닿는 shape가 같아야 함
- 내적은 떨어져 있는 shape가 결과 행렬이 됨
a = np.array([[1, 2, 3],
[2, 3, 4]])
b = np.array([[3, 4, 5],
[1, 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))
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
실제 행렬곲을 하였을 때 반환은 ndarray로 반환된다.
np.dot(a, b)
array([[22, 28],
[22, 28],
[31, 40]])
2-2. arange
- 순차적인 값을 생성할 때 사용
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)
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])
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 속성이 없음
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-91-a9e82b01c079> in <cell line: 1>()
----> 1 np.sort(ndarr1, reverse=True) # reverse 속성이 없음
/usr/local/lib/python3.10/dist-packages/numpy/core/overrides.py in sort(*args, **kwargs)
TypeError: _sort_dispatcher() got an unexpected keyword argument 'reverse'
리스트나 문자열을 역순으로 출력하기 위해서는 [::-1]을 이용하면 된다. 자세한 내용은 아래와 같다
# 문자열 역순으로 출력하기
str1 = 'Python'
print(str1[:]) # 모든 문자를 슬라이싱
print(str1[::]) # print(str1[::1]) -> 1: 정방향
print(str1[::-1]) # -1: 역방향
print(str1[4:1:-1]) # 4번 인덱스부터 1직전까지 역순으로 가져오기
print(str1[4::-1]) # 4번 인덱스부터 0까지 역순으로 가져오기
Python
Python
nohtyP
oht
ohtyP
위의 역순 출력을 이용하여 sort로 정렬한 행렬을 출력하면 내림차순을 반환 받을 수 있다.
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]])
axis는 행을 정렬하는지 열을 정렬하는지 정할 수 있으며 0은 행, 1은 열을 정렬한다.
# 행 정렬
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)[:, ::-1]
array([[12, 11, 10, 9],
[ 4, 3, 2, 1],
[ 8, 7, 6, 5]])
만약 2차원이아닌 다차원ndarray일 경우 -1로 축의 마지막 방향으로 정렬할 수 도있다.
# 축의 마지막 방향
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]])
ndarray에 단일값을 연산할 경우 모든 데이터에 연산을 하게 된다.
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. ]])
'파이썬 데이터 분석' 카테고리의 다른 글
(Python) 형태소 (0) | 2023.06.08 |
---|---|
(Python) 가상 쇼핑몰 데이터 프로젝트 (0) | 2023.06.08 |
(Python) 데이터프레임 활용 (0) | 2023.06.08 |
(Python) Matplotlib (0) | 2023.06.08 |
(Python) 판다스 (0) | 2023.05.18 |