5강 / 20강

행으로 더할까 열로 더할까 — numpy 의 축

sum(0) 과 sum(1), 한 글자가 뜻을 뒤집는다

행으로 더할까 열로 더할까 — numpy 의 축
같은 표라도 어느 방향으로 더하느냐에 따라 '샘플의 크기'가 되기도 '유전자의 총량'이 되기도 합니다.

pandas 표 안쪽에는 numpy 배열이 들어 있습니다. counts.values 라고 하면 이름표를 떼고 숫자만 든 격자가 나와요. 느리고 편한 pandas 와 빠르고 무뚝뚝한 numpy — 생물정보학 코드는 이 둘을 왔다 갔다 합니다.

numpy 에서 가장 자주 틀리는 것이 축(axis) 입니다. 규칙은 하나뿐이에요.

⬇️
axis=0
행 방향으로 뭉갠다 → 열마다 값 하나 (샘플별)
➡️
axis=1
열 방향으로 뭉갠다 → 행마다 값 하나 (유전자별)

외우는 요령: "지정한 축이 사라진다." (24419, 7) 짜리 배열에 sum(axis=0) 을 하면 0번 축(24419)이 사라지고 길이 7이 남습니다. 샘플마다 하나씩이죠.

같은 표, 다른 축. 결과의 길이를 보면 어느 축으로 더했는지 알 수 있습니다.
Python 브라우저에서 실행

🎮 축을 눌러 보기

작은 표에서 sum(0) 과 sum(1) 을 눌러 보세요. 어느 방향으로 뭉개지는지, 결과의 길이가 어떻게 달라지는지 애니메이션으로 보입니다.

축 실험실 — sum(0) 은 아래로, sum(1) 은 옆으로
불러오는 중…

브로드캐스팅 — 모양이 다른데 어떻게 나눠지나

다음 강에서 이런 코드를 씁니다.

cpm = counts / counts.sum(0) * 1e6 (24419, 7) ÷ (7,)

모양이 다른데 나눗셈이 됩니다. numpy 가 길이 7짜리 줄을 24,419번 복사한 셈 치고 계산해 주기 때문이에요. 이것을 브로드캐스팅(broadcasting) 이라고 합니다. "각 열을 그 열의 총합으로 나눈다"가 코드 한 줄이 되는 이유입니다.

모양 (3,3) ÷ (3,) — numpy 가 알아서 줄을 맞춰 줍니다.
Python 브라우저에서 실행
🤔 확인 문제
모양이 (24419, 7) 인 배열에 .sum(1) 을 하면 결과의 길이는?
🤔 확인 문제
라이브러리 크기(library size) 란?
🤔 확인 문제
counts / counts.sum(0) 가 오류 없이 계산되는 까닭은?