1. 행렬 연산
- 넘파이에서는 다차원 배열인 ndarray를 사용하여 행렬 연산을 수행할 수 있다
(덧셈, 뺄셈, 곱셈, 나눗셈은 shape이 같아야 함/행렬의 크기가 같아야 함)- 행렬 연산은 선형 대수와 관련이 깊어, 데이터 과학, 머신러닝, 통계 등 다양한 분야에서 사용
- 차원출력 ($행 ,$열)
a = np.array([[1, 2, 3],
[2, 3, 4]])
b = np.array([[3, 4, 5],
[1, 2, 3]])
print(a.shape, b.shape)
![]() |
- 행열 덧셈
# 행렬 덧셈
print(a + b)
![]() 같은 position끼리 연산됨 - 인덱스 번호가 같은 데이터끼리 연산 |
- 행열 뺄셈
# 행렬 뺄셈
print(a - b)
![]() 같은 position끼리 연산됨 - 인덱스 번호가 같은 데이터끼리 연산 |
- 행열 곱셈
# 행렬 원소별 곱셈(Element-wise Product)
print(a * b)
![]() 같은 position끼리 연산됨 - 인덱스 번호가 같은 데이터끼리 연산 |
- 행열 나눗셈
# 행렬 나눗셈
print(a / b)
![]() 같은 position끼리 연산됨 - 인덱스 번호가 같은 데이터끼리 연산 |
- 행열 곱(Dot Product)-내적연산
- 에러 상황
# 행렬 곱(Dot Product)
# 조건1: 맞닿는 shape가 같아야함
# 조건2: 떨어져 있는 shape가 결과 행렬이 됨
print(np.dot(a, b)) # 에러
print(a @ b) # 에러
![]() |
- 차원확인
c = np.array([[1, 2, 3],
[1, 2, 3],
[2, 3, 4]])
d = np.array([[1,2],
[3, 4],
[5, 6]])
print(c.shape)
print(d.shape)
![]() |
- 계산식
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) , (1*2 + 3*4 + 4*6))
![]() |
- 정확한 표현
c = np.array([[1, 2, 3],
[1, 2, 3],
[2, 3, 4]])
d = np.array([[1,2]
,[3, 4],
[5, 6]])
print(np.dot(c, d))
print('=' * 40)
print(c @ d)
![]() |
- 계산과정
# c@d
print((1*1+2*3+3*5), (1*2+2*4+3*6),(1*1+2*3+3*5), (1*2+2*4+3*6),(2*1+3*3+4*5), (2*2+3*4+4*6))
![]() |
- 전치 행렬: 행과 열 바꿈
# 전치행렬: 행과 열을 바꿈
print(a)
print(a.T)
![]() |
- 역 행렬
: 원래 행렬과 곱했을 때 항등 행렬이 되는 행렬
# 역행렬 : 주어진 정사각 행렬에 대한 곱셈 연산으로 단위 행렬을 얻을 수 있는 행렬
# 단위행렬 : 주대각선의 원소가 모두 1이고, 나머지 원소가 모두 0인 정사각 행렬
# np.linalg.inv(a) # 역행렬을 구하지 못하면 LinAlgError 에러발생
arr = np.array([[1, 2], [3, 4]])
print(np.linalg.inv(arr))
print(arr @ np.linalg.inv(arr))
![]() ![]() |
2. 순차적인 값 생성하기
- NumPy에서 np.arange() 함수는 일정한 간격으로 숫자들을 생성하는 데 사용
- Python의 기본 range() 함수와 유사하지만, NumPy 배열을 반환하므로 수학적인 연산이 가능
- range
# 일반 range
arr1 = range(1, 11)
print(arr1)
for i in arr1:
print(i, end=' ')
![]() |
- np.arange
# np.arange
# 반환되는 값은 ndarray형태
arr2 = np.arange(1, 11)
print(arr2)
for i in arr2:
print(i, end=' ')
![]() |
3. 정렬
- NumPy의 np.sort() 함수는 배열을 정렬하는 데 사용
- 기본적으로 원래 배열을 변경하지 않고 정렬된 배열의 복사본을 반환
- 1차원_오름차순
# 오름차순, 단 사용후 다시 원래대로 돌아옴
ndarr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
print(ndarr1)
print(np.sort(ndarr1))
print(ndarr1)
![]() |
- 1차원_오름차순
# 내림차순
# reverse 속성이 없음
ndarr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
print(np.sort(ndarr1)[::-1])
![]() |
- 2차원 _ 행정렬
# 2차원_행정렬
ndarr2d = np.array([[11, 10, 12, 9],
[3, 1, 4, 2],
[5, 6, 7, 8]])
print(ndarr2d.shape)
print(np.sort(ndarr2d, axis=0)) # 축속성 : 0인 경우, 행을 정렬
![]() |
- 2차원 _ 열정렬
# 2차원 : 열정렬
print(np.sort(ndarr2d, axis=1))
![]() |
- 열정렬 내림차순
# 열 정렬 내림차순
print(np.sort(ndarr2d, axis=1)[:,::-1])
![]() |
- 축의 마지막 방향
# 축의 마지막 방향
print(np.sort(ndarr2d, axis=-1)) # 열정렬과 동일
![]() |
'데이터분석 > 넘파이' 카테고리의 다른 글
01. 넘파이(Numpy) (0) | 2024.05.22 |
---|