NumPy .npy / .npz 검사기
.npy는 아주 작은 헤더 뒤에 숫자 블록이 이어지는 파일이고, 이 도구에 필요한 것은 그 헤더뿐입니다. 매직 6바이트, 버전, 헤더 길이, 그리고 descr·fortran_order·shape을 담은 파이썬 dict 리터럴입니다. JSON이 아닙니다. 앞부분 1KB만 읽기 때문에 2GB 배열도 2KB 파일과 똑같은 속도로 열립니다. 불러올 가치가 있는지 결정하기 전에 안에 무엇이 있는지 먼저 확인하자는 것이 이 도구의 목적입니다. descr는 numpy가 해석하는 방식 그대로 해석합니다. 첫 글자는 바이트 순서로 <는 리틀, >는 빅, |는 해당 없음입니다. 빅엔디언 파일은 따로 표시합니다. 잘못 읽어도 오류처럼 보이지 않고 그냥 다른 숫자가 나오기 때문입니다. 그다음은 종류와 원소 크기입니다. b1 불리언, i1~i8과 u1~u8 정수, f2·f4·f8 실수, c8·c16 복소수, 중간 NUL은 남기고 끝의 NUL만 떼어내는 S<n> 바이트 문자열, UCS-4로 저장되어 세 글자가 12바이트를 차지하는 U<n>, 단위를 대괄호에 넣는 M8·m8, 원시 V<n>, 그리고 O가 있습니다. O는 allow_pickle=True로 저장했다는 뜻이고 불러오는 순간 피클이 실행된다는 뜻이라 눈에 띄게 경고합니다. 구조체 dtype은 (이름, 형식) 또는 (이름, 형식, shape) 튜플의 목록으로 오며 중첩될 수 있습니다. 오프셋은 어디에도 저장되지 않고 원소 크기의 누적 합일 뿐인데, 정렬된 dtype의 descr에 이름 없는 패딩 필드가 들어 있는 이유가 바로 이것입니다. 패딩 필드도 구간과 함께 보여 줍니다. 그다음 수치는 직접 검산할 수 있습니다. shape에서 원소 수, 원소 수 곱하기 원소 크기로 예상 바이트, 그리고 헤더 뒤에 실제로 있는 바이트입니다. 복사 실패나 디스크 부족으로 잘린 파일은 그럴듯한 헤더가 아니라 모자란 바이트 수로 드러납니다. 단순 수치형 dtype은 파일에 놓인 순서대로 앞부분 값을 브라우저에서 디코드하므로 포트란 순서 배열은 열 단위로 읽힙니다. .npz는 .npy 멤버를 담은 zip이며 멤버별 dtype·shape·두 가지 크기와 압축 여부를 함께 보여 줍니다. 하지 않는 일도 분명합니다. 피클을 풀지 않고, 숫자의 의미를 알려 주지 않으며, 데이터가 멀쩡한지 검증하지도 않습니다. 파일이 스스로 주장하는 내용과 그 주장이 파일 크기와 어긋나는 지점을 보여 줄 뿐입니다.
사용법
- .npy나 .npz를 상자에 끌어다 놓으세요. 헤더만 읽으므로 파일 크기는 상관없습니다.
- dtype, shape, 원소 수를 먼저 보세요. "여기 뭐가 들었나"에 대한 답이고 읽기 한 번이면 됩니다.
- 예상 데이터와 실제 데이터를 비교하세요. 실제가 적으면 파일이 잘린 것이고, 많으면 배열 뒤에 뭔가 덧붙은 것입니다.
- 구조체 dtype이면 필드 표를 펼치세요. 정렬된 dtype이 끼워 넣은 이름 없는 패딩까지 형식·오프셋·크기가 모두 나옵니다.
- .npz라면 멤버 이름을 눌러 그 배열을 살펴보세요. 목록에는 압축된 크기와 풀었을 때의 크기가 함께 나옵니다.
자주 묻는 질문
- .npy 헤더에는 정확히 무엇이 들어 있나요?
- 매직 6바이트(\x93NUMPY), 2바이트 버전, 헤더 길이, 그리고 헤더 본문입니다. 본문은 descr·fortran_order·shape 세 키만 가진 파이썬 dict 리터럴입니다. JSON이 아니라서 JSON.parse로는 읽을 수 없습니다. 문자열은 작은따옴표, 불리언은 True와 False, shape은 (3)이 아니라 (3,)처럼 쓰는 튜플이고, 닫는 중괄호 앞에는 쉼표가 하나 더 붙습니다. 그다음 배열 데이터가 64바이트 경계에서 시작하도록 공백으로 채웁니다. numpy가 정렬된 로드로 파일을 메모리 매핑할 수 있는 이유가 이 패딩입니다. 이 도구는 descr를 파일에 적힌 그대로 보여 주므로 중간에 정규화되었는지 의심할 필요가 없습니다.
- 문자열 배열이 글자 수의 네 배나 되는 이유는 뭔가요?
- numpy의 U dtype이 UCS-4로 저장하기 때문입니다. 어떤 문자든 4바이트 고정이라 원소 크기가 선언 길이의 네 배가 됩니다. U32 필드는 값이 전부 "ok"여도 원소마다 128바이트를 씁니다. 바이트 문자열 S는 문자당 1바이트지만 나름의 함정이 있습니다. 읽을 때 끝의 NUL을 떼어내므로 정말로 0바이트로 끝나는 값은 왕복이 안 되고, 중간의 NUL은 그대로 남습니다. 데이터셋이 이상하게 크다면 대개 U dtype이 원인이고, 해법은 인코딩을 정해 S로 저장하거나 문자열을 아예 별도 배열로 빼는 것입니다.
- dtype이 object로 나옵니다. 무슨 뜻이고 왜 경고하나요?
- object 배열은 값을 저장하지 않고 포인터를 저장합니다. 그래서 저장할 때 numpy가 전체를 피클로 직렬화하고 불러올 때 역직렬화합니다. 역직렬화는 파싱이 아닙니다. 임의의 객체를 만들고 임의의 코드를 호출할 수 있습니다. numpy.load가 allow_pickle=True 없이는 object 배열을 거부하는 이유입니다. descr가 |O인 .npy는 데이터인 만큼 프로그램이기도 하고, 안전성은 작성자의 안전성과 같습니다. 이 페이지는 절대 피클을 풀지 않고 dtype과 피클 크기만 알려 주고 멈춥니다. 내용이 평범한 문자열이나 들쭉날쭉한 리스트라면 고정 폭 dtype이나 .npz의 여러 배열로 다시 쓰는 편이 낫습니다.
- fortran_order는 무엇을 바꾸나요?
- 같은 숫자가 파일에 놓이는 순서만 바꿉니다. False면 마지막 축이 가장 빨리 변하고(C, 행 우선), True면 첫 축이 가장 빨리 변합니다(열 우선). np.asfortranarray를 거쳤거나 포트란·MATLAB에서 온 데이터가 그렇습니다. shape과 dtype은 어느 쪽이든 같으므로 이 플래그를 무시한 리더는 실패하지 않습니다. 대신 배열을 조용히 전치해 버리는데, 예외가 나는 것보다 훨씬 나쁜 결과입니다. 여기의 미리보기는 논리적 배치가 아니라 파일을 따라가므로 포트란 순서의 2×3 배열은 0열, 1열, 2열 순으로 읽힙니다.
- 포맷 버전이 왜 셋이나 있나요?
- 1.0은 헤더 길이를 2바이트에 담아 헤더가 65535바이트로 제한됩니다. 2.0은 그것으로 모자란 드문 경우에 4바이트를 씁니다. 필드가 수천 개인 구조체 dtype이면 그렇게 되고 헤더가 수백 KB에 이릅니다. 3.0은 2.0과 같되 헤더를 Latin-1이 아니라 UTF-8로 선언하며, Latin-1에 없는 문자가 필드 이름에 있을 때만 numpy가 씁니다. numpy는 항상 들어맞는 가장 낮은 버전을 고르므로 2.0이나 3.0이라는 사실 자체가 정보입니다. 하나 더, numpy의 로더는 max_header_size를 올리지 않으면 10000바이트가 넘는 헤더를 거부합니다. 정상적인 2.0 파일이 파이썬에서는 안 열리면서 여기서는 열릴 수 있습니다.
- 파일이 업로드되나요? 아주 큰 배열도 열 수 있나요?
- 업로드는 없고, 열 수 있습니다. 브라우저의 File API로 조각만 읽습니다. 헤더용 1KB 남짓과 값 미리보기용 몇 KB가 전부입니다. 2GB 배열을 메모리에 올리는 일은 없습니다. 바로 그 상황을 위한 도구입니다. 누가 파일을 건넸고, dtype과 shape이 궁금하고, 실제로 불러오면 몇 분과 램 대부분을 쓰게 되는 상황 말입니다. .npz는 파일 끝의 zip 디렉터리와 멤버별 헤더만 읽으므로 목록 조회는 읽기 두 번에 멤버당 한 번입니다. 아무것도 전송하지 않으니 페이지를 연 뒤 네트워크를 끊어도 그대로 동작합니다.
관련 도구
TAR 아카이브 검사기
.tar, .tar.gz, .tgz 파일을 풀지 않고 내부 항목을 전부 봅니다. 권한, 소유자, 크기, 시각, 링크 대상까지 표시합니다.
xz(.xz) 스트림 분석기
xz 컨테이너를 읽습니다. 스트림 헤더, 블록 헤더와 필터 체인, 인덱스와 푸터, 그리고 압축을 풀지 않고 알아낸 실제 원본 크기까지.
gzip(.gz) 구조 분석기
.gz 헤더를 필드 단위로 읽고 모든 멤버를 훑은 뒤, 브라우저에서 CRC32와 실제 크기를 다시 계산해 트레일러를 검증합니다.
SQLite 데이터베이스 검사기
.sqlite·.db 파일을 브라우저에서 열어 구조를 봅니다. 페이지 크기, 인코딩, 저널 모드, 테이블별 실제 행 수까지.
정적 라이브러리(.a) 분석기
.a 아카이브를 브라우저에서 읽습니다. 멤버의 크기와 날짜, 각 오브젝트가 정의하고 필요로 하는 심볼, 그리고 심볼 인덱스가 낡았는지까지 보여줍니다.
CSV 뷰어 & 정렬
CSV·TSV 데이터를 정렬 가능한 표로 보기 — 파일 열기 또는 붙여넣기, 스프레드시트 불필요.