import numpy as np
a1 = np.array([1, 2 ,3])
a2 = np.array([4, 5, 6])
print(a1 + a2)
print(a1 - a2)
a1 = np.arange(1, 5).reshape(2, 2)
a2 = np.arange(11, 15).reshape(2, 2)
print(a1)
print(a2)
print(a1 + a2)
print(a2-a1)
# 배열과 스칼라 연산 (1차원)
a1 = np.array([1, 2, 3, 4])
print(a1 + 10)
print(a1 * 2)
# 배열과 스칼라 연산 (2차원)
a1 = np.arange(1, 5).reshape(2, 2)
a2 = np.arange(11, 15).reshape(2, 2)
print(a1)
print(a2)
print(a1 + 5)
print(a2 * 3)
print(a2 / 2)
# 배열의 구조가 다를 경우
a1 = np.array([1, 2])
a2 = np.array([1, 2, 3])
# print(a1 + a2) # ValueError: 행렬의 크기가 맞지 않아 오류 발생
a1 = np.array([[1, 2, 3,],
[4, 5, 6]]) # (2, 3)
a2 = np.array([10, 20, 30]) # 길이가 3인 1차원 배열 (3, )
# 1차원 길이 3
[10, 20, 30]
# 2차원으로 변형(1, 3)
[[10, 20, 30]]
# 2차원의 행이 2 -> 2로 확장
[[10, 20, 30],
[10, 20, 30]]
print(a1 + a2)
# 브로드캐스팅 예제
a1 = np.array([[1], [2], [3]]) # (3, 1)
a2 = np.array([10, 20, 30]) # (3, )
# a2: (3, ) -> (1, 3)로 변환됨
[[10, 20, 30]]
# a1과 a2 비교 -> (3, 1), (1, 3)
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
[[10, 20, 30], [10, 20, 30], [10, 20, 30]]
print(a1 + a2)
arr = np.array([1, 2, 3, 4])
print(arr + 3)
결과

arr = np.array([[5, 10],
[15, 20]])
print(arr * (-1))
결과

arr1 = np.array([2, 4, 6])
arr2 = np.array([1, 2, 3])
print(arr1 * arr2)
print(arr1 / arr2)
결과

arr = np.array([[95, 97],
[80, 85]])
print(100 - arr)
결과

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr[0, :] * 10, arr[1, :] * 100)
결과

arr = np.array([[10, 20],
[30, 40],
[50, 60]])
arr1d = np.array([100, 200, 300]).reshape(3, 1)
print(arr + arr1d)
결과

a = np.array([[1, 2, 3], [4, 5, 6]])
print("원소의 합:", np.sum(a))
print("원소의 평균", np.mean(a))
print("표준편차:", np.std(a))
print("최댓값:", np.max(a))
print("최솟값:", np.min(a))
print("최댓값의 인덱스:", np.argmax(a))
print("최솟값의 인덱스:", np.argmin(a))
결과

axis = 0 -> 가장 높은 차원 기준 -> 행 기준
axis = 1 -> 그 다음에 가장 높은 차원 기준 -> 열 기준
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("행기준 합", np.sum(a, axis = 0))
print("열기준 합", np.sum(a, axis = 1))
print("행기준평균", np.mean(a, axis = 0))
print("열기준평균", np.mean(a, axis = 1))
# 누적 연산
arr = np.array([1, 2, 3, 4])
print(np.cumsum(arr))
print(np.cumprod(arr))
arr = np.array([5, 10, 15, 20])
print("합",np.sum(arr))
print("평균", np.mean(arr))
결과

arr = np.array([[3, 7, 1],
[9, 2, 8]])
print("최댓값", np.max(arr))
print("최솟값", np.min(arr))
결과

arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("행기준 합", np.sum(arr, axis = 0))
print("열기준 합", np.sum(arr, axis = 1))
결과

arr = np.array([[10, 20],
[30, 40],
[50, 60]])
print("행 기준 평균", np.mean(arr, axis = 0))
print("열 기준 평균", np.mean(arr, axis = 1))
결과

arr = np.array([2, 4, 4, 4, 5, 5, 7, 9])
print("표준편차", np.std(arr))
print("평균", np.mean(arr))
print("편차", arr - np.mean(arr))
결과

arr = np.array([[1, 2, 3],
[4, 5, 6]])
print("행 단위 누적 합", np.cumsum(arr, axis = 0))
print("열 단위 누적 곱", np.cumprod(arr, axis = 1))
결과

arr = np.array([10, 20, 30, 40, 50])
result = np.where(arr > 30, "High", "Low")
result
arr = np.array([10, 20, 30, 40, 50])
# 조건만 넣을 경우 조건을 만족하는 원소의 인덱스르 반환
result = np.where(arr > 30)
print(result)
print(arr[result]) # Fancy Indexing
# and 연산 (&)
arr = np.array([10, 20, 30, 40, 50])
mask_and = (arr > 10) & (arr < 50)
print("&연산", arr[mask_and])
# or 연산 (|)
mask_or = (arr < 20) | (arr > 40)
print("|연산", arr[mask_or])
# not 연산 (~)
mask_not = ~(arr > 30)
print("~연산", arr[mask_not])
arr = np.array([5, 12, 18, 7, 30, 25])
print(arr[(arr > 10) & (arr < 20)])
결과

arr = np.array([10, 15, 20, 25, 30, 35])
print(arr[(arr <= 15) | (arr >= 30)])
결과

arr = np.array([3, 8, 15, 6, 2, 20])
arr[arr >= 10] = 0
print(arr)
결과

arr = np.array([7, 14, 21, 28, 35])
result = np.where(arr >= 20, "High", "Low")
print(result)
결과

arr = np.arange(0, 10)
arr_odd = np.where(arr % 2 == 0, arr * 10, arr)
print(arr_odd)
결과

arr = np.array([[10, 25, 30],
[40, 5, 15],
[20, 35, 50]])
arr_condition = np.array(arr[(20 <= arr) & (arr <= 40)])
print(arr_condition)
결과

arr = np.array([1, 2, 3, 4, 5, 6])
# arr_3 = np.where(arr[arr % 3 != 0])
print(arr[arr % 3 != 0])
결과

arr = np.arange(0, 100).reshape(10, 10)
arr_change = np.where(arr >= 50, arr, 50)
print(arr_change)
결과

arr = np.array([[5, 50, 95],
[20, 75, 10],
[60, 30, 85]])
arr_change = np.where(arr >= 70, "A", np.where(arr >= 30, "B", "C"))
print(arr_change)
결과

# 스칼라 연산(OD)
a = np.array(3)
b = np.array(4)
print(np.dot(a, b))
# 1차원 배열 간 연산 -> 내적
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.dot(a, b))
# 물건 구매
# 데이터 분석에서 벡터랑 배열
c = [1000, 2000, 5000, 10000]
d = [10, 3, 5, 7]
print(np.dot(c, d))
# 2차원 배열간 연산 -> 행렬 곱셈
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[1, 2], [3, 4], [5, 6]])
print(np.dot(a,b))
a = np.array(3)
b = np.array(4)
# print(np.matmul(a, b))
a = np.array([1, 2])
b = np.array([3, 4])
print(np.matmul(a, b))
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[1, 2], [3, 4], [5, 6]])
print(np.matmul(a,b))
# 2차원 * 1차원 간 연산
c = np.array([[1, 2], [3, 4]])
d = np.array([5, 6])
print(np.matmul(c, d))
print(np.matmul(d, c))
# @ 연산자
e = np.array([[1, 2, 3]])
f = np.array([[1, 2],
[3, 4],
[5, 6]])
print(np.matmul(e, f))
print(e @ f)
A = np.arange(1, 10).reshape(3, 3)
B = np.full((3, 2), 2)
print(A)
print(B)
print(np.matmul(A, B))
결과

I = np.eye(4, 4)
M = np.random.randint(0, 9, (4, 4))
print(np.matmul(I, M))
print(M)
결과

X = np.ones((2, 5))
Y = np.arange(5, 15).reshape(5, 2)
print(X @ Y)
결과

C = np.random.randint(0, 5, (3, 2))
D = np.random.randint(0, 5, (2, 3))
print((np.matmul(C, D)).shape)
결과
