배열 코드에서 되풀이되는 다섯 패턴
벡터와 텐서 코드를 읽을 때는 함수 이름보다 입력과 출력의 모양이 어떻게 바뀌는지 먼저 봐. 다음 다섯 패턴이 자주 반복돼.
- 원소별 연산:
a + b,a * b,np.exp(a). 각 위치에 같은 규칙을 적용하고 보통 브로드캐스팅 뒤의 모양을 유지해. - 축소:
a.sum(),a.mean(),a.max(). 지정한 축의 여러 값을 하나로 합쳐 그 축을 없애거나 길이 1로 남겨. - 내적과 행렬곱:
a @ b. 입력의 차원 수와 모양에 따라 벡터 내적이나 행렬곱, 배치 행렬곱으로 동작해. - 브로드캐스팅: 호환되는 서로 다른 모양을 개념적으로 맞춰 원소별 연산을 수행해. 실제로 전체 복사본을 만들 필요는 없어.
- 슬라이싱과 고급 인덱싱:
a[2:5],a[a > 0],a[indices]로 일부 원소를 고르거나 새 배열을 만들어.
브로드캐스팅 규칙
모양이 (4, 3)인 행렬에 (3,) 벡터를 더하면 벡터가 각 행에 적용돼. 두 모양을 오른쪽부터 맞췄을 때 각 축의 길이가 같거나 둘 중 하나가 1이면 호환되고, 한쪽에 축이 없으면 길이 1인 축처럼 취급해.
호환된다는 사실이 계산 뜻까지 보장하지는 않아. 잘못된 축을 우연히 브로드캐스트하면 오류 없이 틀린 결과가 나올 수 있으니 중간 모양과 축의 의미를 확인해.
배열 루프를 쓰기 전에 라이브러리가 제공하는 벡터화 연산이 있는지 찾아. 더 빠르고 의도가 선명해지는 경우가 많지만, 복잡한 제어나 메모리 사용까지 무조건 좋아지는 만능 규칙은 아니야. 측정하고 선택해.
트랙 보상
벡터의 크기와 방향, 내적과 노름을 익히고 코드에서는 모양 변화로 연산을 읽는 법을 배웠어. 다음 트랙에서는 이 벡터들을 한꺼번에 변환하는 행렬로 넘어가.
just do it 정신을 잠시 잃고 너무 오랜만에 돌아왔어 , 평균 0 , 표준편차 1 인거 확인!
import numpy as np
rng = np.random.default_rng(42) X = rng.standard_normal((5, 3))
mu = X.mean(axis=0) sigma = X.std(axis=0)
Z = (X - mu) / sigma
print("열 평균:", Z.mean(axis=0)) print("열 std :", Z.std(axis=0))
assert np.allclose(Z.mean(axis=0), 0, atol=1e-12) assert np.allclose(Z.std(axis=0), 1, atol=1e-12) print("검증 통과")