Loop 그만 써
배열 없는 언어에서 넘어올 때 제일 깊이 박혀 오는 습관이 요소별 연산을 loop 로 쓰는 거야: for i in range(len(x)): result[i] = x[i] * 2. NumPy 에선 result = x * 2 라고 적으면 끝이야. 같은 답이 더 빨리 나오고, 코드는 짧아지고, (이게 은근히 중요한데) off-by-one 에러가 낄 자리 자체가 없어져.
더 어려운 전환은 배열 두 개를 묶는 연산이야. Python 리스트라면 zip(a, b) 에 comprehension 을 얹었겠지. NumPy 에선 a * b — shape 만 호환되면 NumPy 가 알아서 처리해.
Broadcasting 한 단락 요약
Broadcasting 은 모양이 다른 배열을 결합할 때 NumPy 가 따르는 규칙이야. 규칙은 셋: 뒤쪽 차원부터 맞춰 보고, 크기 1인 차원은 늘려서 맞추고, 아예 없는 차원은 크기 1로 쳐. 이게 왜 좋으냐면 — "이 row 벡터를 행렬의 모든 row 에 더해", "모든 요소에서 이 스칼라 빼" 같은 걸 loop 한 줄 없이, 중간 copy 한 번 없이 그대로 적을 수 있거든.