같은 표라도 어느 방향으로 더하느냐에 따라 '샘플의 크기'가 되기도 '유전자의 총량'이 되기도 합니다.
pandas 표 안쪽에는 numpy 배열이 들어 있습니다.
counts.values 라고 하면 이름표를 떼고 숫자만 든 격자가 나와요.
느리고 편한 pandas 와 빠르고 무뚝뚝한 numpy — 생물정보학 코드는 이 둘을 왔다 갔다 합니다.
numpy 에서 가장 자주 틀리는 것이 축(axis) 입니다. 규칙은 하나뿐이에요.
외우는 요령: "지정한 축이 사라진다."
(24419, 7) 짜리 배열에 sum(axis=0) 을 하면
0번 축(24419)이 사라지고 길이 7이 남습니다. 샘플마다 하나씩이죠.
같은 표, 다른 축. 결과의 길이를 보면 어느 축으로 더했는지 알 수 있습니다.
🎮 축을 눌러 보기
작은 표에서 sum(0) 과 sum(1) 을 눌러 보세요.
어느 방향으로 뭉개지는지, 결과의 길이가 어떻게 달라지는지 애니메이션으로 보입니다.
브로드캐스팅 — 모양이 다른데 어떻게 나눠지나
다음 강에서 이런 코드를 씁니다.
cpm = counts / counts.sum(0) * 1e6
(24419, 7) ÷ (7,)
모양이 다른데 나눗셈이 됩니다. numpy 가 길이 7짜리 줄을 24,419번 복사한 셈 치고
계산해 주기 때문이에요. 이것을 브로드캐스팅(broadcasting) 이라고 합니다.
"각 열을 그 열의 총합으로 나눈다"가 코드 한 줄이 되는 이유입니다.
모양 (3,3) ÷ (3,) — numpy 가 알아서 줄을 맞춰 줍니다.
🤔 확인 문제
모양이 (24419, 7) 인 배열에 .sum(1) 을 하면 결과의 길이는?
해설 지정한 축이 사라진다는 규칙을 씁니다. axis=1(길이 7)이 사라지고 24,419가 남습니다 — 유전자마다 값 하나입니다.
🤔 확인 문제
라이브러리 크기(library size) 란?
해설 샘플 하나의 모든 유전자 개수를 합한 값, 즉 counts.sum(0) 입니다. 샘플마다 다르기 때문에 원시 개수를 그대로 비교하면 안 됩니다.
🤔 확인 문제
counts / counts.sum(0) 가 오류 없이 계산되는 까닭은?
해설 브로드캐스팅입니다. 길이 7짜리 1차원 배열이 (24419, 7) 의 각 행에 맞춰 반복 적용됩니다 — 즉 열마다 자기 총합으로 나뉩니다.