Files
MNIST/docs/nbconvert/HTML_convert/01_data_loading.html
T
2026-05-15 21:33:11 -05:00

2303 lines
112 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'><style type='text/css'>html {overflow-x: initial !important;}</style>
<style type='text/css' id="style-base">:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; }
.mac-os-11 { --title-bar-height: 28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, "Segoe UI Emoji", "SF Pro", sans-serif; -webkit-font-smoothing: antialiased; }
h1, h2, h3, h4, h5 { white-space: pre-wrap; }
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p *, #write.first-line-indent svg * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
body.typora-export { padding-left: 0px; padding-right: 0px; }
#write { padding-left: 20px; padding-right: 20px; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; position: relative; }
#write svg h1, #write svg h2, #write svg h3, #write svg h4, #write svg h5, #write svg h6, #write svg p { position: static; }
svg sub, svg sup { position: static; }
.nodeLabel p { padding-right: 2px; padding-left: 2px; }
.typora-export .nodeLabel p { padding-right: 0px; padding-left: 0px; }
foreignobject { overflow: visible; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
li p { orphans: 1; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
thead, tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
svg { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
#write { margin-top: 0px; border-color: transparent !important; padding-top: 0px !important; padding-bottom: 0px !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
.typora-export #write { break-after: avoid; }
.typora-export #write::after { height: 0px; }
.is-mac table { break-inside: avoid; }
#write > p:nth-child(1) { margin-top: 0px; }
.typora-export-show-outline .typora-export-sidebar { display: none; }
figure { overflow-x: visible; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.reversefootnote { font-family: ui-monospace, sans-serif; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.6; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print {
.typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background: inherit; }
.mermaid-svg { margin: auto; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) {
.typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) {
.typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; overflow-wrap: anywhere; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ""; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
.md-inline-math-container mjx-container { zoom: 0.95; }
mjx-container { break-inside: avoid; }
.md-alert.md-alert-note { border-left-color: rgb(9, 105, 218); }
.md-alert.md-alert-important { border-left-color: rgb(130, 80, 223); }
.md-alert.md-alert-warning { border-left-color: rgb(154, 103, 0); }
.md-alert.md-alert-tip { border-left-color: rgb(31, 136, 61); }
.md-alert.md-alert-caution { border-left-color: rgb(207, 34, 46); }
.md-alert { padding: 0px 1em; margin-bottom: 16px; color: inherit; border-left: 0.25em solid rgb(0, 0, 0); }
.md-alert-text-note { color: rgb(9, 105, 218); }
.md-alert-text-important { color: rgb(130, 80, 223); }
.md-alert-text-warning { color: rgb(154, 103, 0); }
.md-alert-text-tip { color: rgb(31, 136, 61); }
.md-alert-text-caution { color: rgb(207, 34, 46); }
.md-alert-text { font-size: 0.9rem; font-weight: 700; }
.md-alert-text svg { fill: currentcolor; position: relative; top: 0.125em; margin-right: 1ch; overflow: visible; }
.md-alert-text-container::after { content: attr(data-text); text-transform: capitalize; pointer-events: none; margin-right: 1ch; }
</style>
<style type='text/css' id="style-codemirror">.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
span.cm-underlined { text-decoration: underline; }
span.cm-strikethrough { text-decoration: line-through; }
.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); }
.cm-tw-deleted { text-decoration: line-through; }
.cm-tw-header5 { font-weight: 700; }
.cm-tw-listitem:first-child { padding-left: 10px; }
.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; }
.cm-tw-underline { text-decoration: underline; }
@media print {
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}
</style>
<style type='text/css' id="style-theme_css">/*
* NOTION-STYLE TYPORA THEME - DARK MODE
* Copyright (C) 2025 Aditya Kumar Darak
* Based on original work by cayxc
* Licensed under the Apache License, Version 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*/
/* =========================================================================
Table of Contents
=========================================================================
1. Theme Tokens
2. Base & Layout
3. Block Elements
4. Code & Syntax
5. Inline Elements
6. Sidebar & Navigation
7. Typora Chrome
8. Utilities & Export
========================================================================= */
/* =========================================================================
1. Theme Tokens
========================================================================= */
:root {
/* Colors */
--bg-color: rgba(25, 25, 25, 1);
--text-color: rgba(212, 212, 212, 1);
--accent-color: rgba(156, 166, 168, 1);
--accented-background-color: rgba(193, 202, 204, 1);
--title-color: rgba(212, 212, 212, 1);
--text-grey: rgba(156, 156, 156, 1);
/* Legacy Typora search highlight token. */
--color-2-0-c: rgba(156, 166, 168, 1);
/* Borders */
--border-color: rgba(61, 61, 61, 1);
/* Links and highlights */
--link-color: rgba(127, 179, 255, 1);
--link-hover-color: rgba(179, 212, 255, 1);
--link-hover-bg: rgba(127, 179, 255, 0.12);
--selection-bg: rgba(255, 238, 160, 1);
--selection-color: rgba(0, 0, 0, 1);
--highlight-bg: rgba(255, 238, 160, 1);
--search-highlight-bg: rgba(233, 188, 54, 1);
/* Headings */
--h1-color: rgba(247, 246, 243, 1);
--h2-color: rgba(232, 231, 228, 1);
--h3-color: rgba(212, 212, 212, 1);
--h4-color: rgba(192, 192, 192, 1);
--h5-color: rgba(176, 176, 176, 1);
--h6-color: rgba(160, 160, 160, 1);
/* Sidebar */
--side-bar-bg-color: rgba(32, 32, 32, 1);
--side-bar-border-color: rgba(43, 43, 43, 1);
--active-file-bg-color: rgba(44, 44, 44, 1);
/* Typography */
--body-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei",
"Noto Sans SC", "Microsoft JhengHei", "Noto Sans TC", "Meiryo", "Yu Gothic",
"Noto Sans JP", "Malgun Gothic", "Noto Sans KR", sans-serif;
--monospace-font: "Sarasa Mono SC", "Source Han Mono", "Space Mono",
"Inconsolata", monospace;
/* Type scale */
--font-size: 16px;
--h1-fontsize: 30px;
--h2-fontsize: 24px;
--h3-fontsize: 20px;
--h4-fontsize: 18px;
--h5-fontsize: 16px;
--h6-fontsize: 16px;
--monospace-font-size: 85%;
/* Line rhythm */
--line-height: 1.6;
--monospace-line-height: normal;
--paragraph-spacing: 19.2px;
/* Layout */
--document-padding-x: 10ch;
--vertical-padding: 40px;
--main-content-max-width: 90%;
--border-radius: 2px;
--border-radius-lg: 4px;
/* Inline code */
--code-font: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
--code-bg-color: rgba(135, 131, 120, 0.15);
--code-color: rgba(235, 87, 87, 1);
--code-border-radius: 3px;
/* Code blocks */
--code-block-bg-color: rgba(32, 32, 32, 1);
--code-block-font-size: 15.2px;
--code-block-line-height: 1.65;
--code-tooltip-height: 34px;
--code-tooltip-gap: calc(var(--code-tooltip-height) + 5px);
--code-tooltip-border-color: rgba(55, 55, 55, 1);
--code-border-color: rgba(255, 255, 255, 0.12);
--code-border-hover-color: rgba(255, 255, 255, 0.2);
--code-selection-bg: rgba(255, 238, 160, 1);
--code-selection-color: rgba(0, 0, 0, 1);
/* Todo checkboxes */
--todo-bg-color: rgba(36, 131, 226, 1);
--todo-check-color: rgba(255, 255, 255, 1);
/* File tree */
--file-tree-font-size: 12px;
/* Diagrams */
--mermaid-theme: dark;
/* Performance */
--gpu-acceleration: translateZ(0);
/* Animation */
--transition-fast: 0.15s;
--transition-normal: 0.2s;
--transition-slow: 0.3s;
--easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
--easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
--easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
}
/* =========================================================================
2. Base & Layout
========================================================================= */
/* Document base */
html {
font-size: var(--font-size);
background-color: var(--bg-color);
}
html,
body {
color: var(--text-color);
font-family: var(--body-font);
line-height: var(--line-height);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
/* Paragraph rhythm */
p {
margin: var(--paragraph-spacing) 0;
line-height: var(--line-height);
}
h1+p,
h2+p,
h3+p,
h4+p,
h5+p,
h6+p {
margin-top: 8px;
}
/* Main document container */
#write {
padding-left: var(--document-padding-x);
padding-right: var(--document-padding-x);
max-width: var(--main-content-max-width);
box-sizing: border-box;
contain: layout style;
}
/* Media */
#write img {
border-radius: 8px;
max-width: 100%;
height: auto;
display: block;
margin-left: auto;
margin-right: auto;
}
/* Image captions */
#write .md-image>.md-meta {
color: rgba(212, 212, 212, 0.7);
font-size: 14px;
font-style: italic;
margin-top: 8px;
text-align: center;
}
/* =========================================================================
3. Block Elements
========================================================================= */
/* Frontmatter (YAML) */
pre.md-meta-block {
background: rgba(32, 32, 32, 1);
color: rgba(255, 255, 255, 0.8);
padding: 12px;
border-radius: 3px;
width: 100%;
border: 1px solid rgba(255, 255, 255, 0.13);
box-shadow: none;
font-family: var(--code-font);
font-size: var(--monospace-font-size);
line-height: 1.5;
}
pre.md-meta-block .md-meta-i {
color: rgba(121, 192, 255, 1);
font-weight: 500;
}
pre.md-meta-block .md-meta-value {
color: rgba(126, 231, 135, 1);
}
/* Headings */
h1 {
margin-top: 48px;
margin-bottom: 24px;
padding-top: 8px;
font-size: var(--h1-fontsize);
font-weight: 700;
line-height: 1.3;
letter-spacing: -0.32px;
color: var(--h1-color);
}
h1:first-child {
margin-top: 16px;
}
h2 {
margin-top: 40px;
margin-bottom: 19.2px;
font-size: var(--h2-fontsize);
font-weight: 600;
line-height: 1.35;
letter-spacing: -0.16px;
color: var(--h2-color);
}
h3 {
margin-top: 32px;
margin-bottom: 16px;
font-size: var(--h3-fontsize);
font-weight: 600;
line-height: 1.4;
letter-spacing: -0.08px;
color: var(--h3-color);
}
h4 {
margin-top: 28px;
margin-bottom: 12.8px;
font-size: var(--h4-fontsize);
font-weight: 600;
line-height: 1.45;
color: var(--h4-color);
}
h5 {
margin-top: 24px;
margin-bottom: 9.6px;
font-size: var(--h5-fontsize);
font-weight: 600;
line-height: 1.5;
color: var(--h5-color);
}
h6 {
margin-top: 24px;
margin-bottom: 9.6px;
font-size: var(--h6-fontsize);
font-weight: 500;
line-height: 1.5;
font-style: italic;
color: var(--h6-color);
}
/* Tables */
#write table {
margin: 24px 0;
width: auto;
max-width: 100%;
border-collapse: separate;
border-spacing: 0;
border: 1px solid var(--border-color);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
td,
th {
min-width: 120px;
max-width: 560px;
width: auto;
word-wrap: break-word;
white-space: normal;
border-right: 1px solid var(--border-color);
border-bottom: 1px solid var(--border-color);
padding: 12px 16px;
font-size: 15.2px;
}
td:last-child,
th:last-child {
border-right: none;
}
tbody tr:last-child td {
border-bottom: none;
}
th {
background-color: rgba(255, 255, 255, 0.08);
font-weight: 600;
text-align: left;
color: rgba(255, 255, 255, 0.9);
font-size: 14.4px;
letter-spacing: 0px;
}
tbody tr:nth-child(even) {
background-color: rgba(255, 255, 255, 0.02);
}
tbody tr {
transition: background-color 0.15s ease;
}
tbody tr:hover {
background-color: rgba(255, 255, 255, 0.06);
}
h2+table tr:first-child th,
h2+table tr:first-child td {
border-top-width: 0;
}
td[align="center"],
th[align="center"] {
text-align: center;
}
td[align="right"],
th[align="right"] {
text-align: right;
}
/* Lists */
#write ul,
#write ol {
padding-left: 0;
margin-left: 0;
}
#write ul li,
#write ol li {
padding-left: 0;
margin-left: 32px;
}
ol ol {
counter-reset: sub-counter;
list-style-type: lower-alpha;
}
ol ol ol {
counter-reset: sub-sub-counter;
list-style-type: lower-roman;
}
#write ul>li::marker {
color: var(--accent-color);
font-weight: 600;
}
#write ol>li::marker {
color: var(--accent-color);
font-weight: 600;
font-size: 15.2px;
}
#write ul ul>li::marker,
#write ol ol>li::marker {
color: rgba(156, 166, 168, 0.7);
}
#write ul ul ul>li::marker,
#write ol ol ol>li::marker {
color: rgba(156, 166, 168, 0.5);
}
li p {
margin: 0;
}
/* Task list checkboxes */
#write .md-task-list-item>input {
appearance: none;
-webkit-appearance: none;
display: inline-block;
vertical-align: middle;
position: absolute;
border: 2px solid rgba(212, 212, 212, 0.4);
margin: 3.2px 0 0 -23.2px;
height: 16px;
width: 16px;
border-radius: 3px;
background-color: rgba(0, 0, 0, 0);
cursor: pointer;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
#write .md-task-list-item>input:hover {
border-color: var(--todo-bg-color);
background-color: rgba(36, 131, 226, 0.1);
transform: scale(1.05) var(--gpu-acceleration);
}
#write .md-task-list-item>input:focus {
outline: 2px solid var(--todo-bg-color);
outline-offset: 2px;
box-shadow: 0 0 0 3px rgba(36, 131, 226, 0.1);
}
#write .md-task-list-item>input[checked] {
background: var(--todo-bg-color);
border: 2px solid var(--todo-bg-color);
animation: checkboxPop 0.2s ease-out;
}
@keyframes checkboxPop {
0% {
transform: scale(1);
}
50% {
transform: scale(1.15);
}
100% {
transform: scale(1);
}
}
#write .md-task-list-item>input[checked]::before {
content: "";
display: block;
width: 5.6px;
height: 9.6px;
background: rgba(0, 0, 0, 0);
border: 2px solid var(--todo-check-color);
border-top: none;
border-left: none;
position: absolute;
box-sizing: border-box;
top: 42%;
left: 50%;
transform: translate(-50%, -50%) rotate(45deg);
animation: checkmarkDraw 0.2s ease-out 0.1s both;
}
@keyframes checkmarkDraw {
0% {
height: 0;
width: 0;
}
50% {
height: 9.6px;
width: 0;
}
100% {
height: 9.6px;
width: 5.6px;
}
}
#write .md-task-list-item>input[checked]+label,
#write .md-task-list-item.task-list-done {
color: rgba(156, 156, 156, 0.7);
text-decoration: line-through;
text-decoration-color: rgba(156, 156, 156, 0.5);
transition: all 0.2s ease;
}
.md-image>.md-meta {
border-radius: var(--border-radius);
padding: 2px 0px 0px 4px;
font-size: 14.4px;
color: inherit;
}
/* Blockquotes and Callouts */
#write blockquote {
margin: 24px 0;
padding: 16px 20px 16px 48px;
position: relative;
border-left: 3px solid var(--accent-color);
background-color: rgba(45, 45, 45, 0.4);
border-radius: 5px;
font-style: italic;
color: rgba(212, 212, 212, 0.9);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
#write blockquote::before {
content: '"';
position: absolute;
left: 12px;
top: 8px;
font-size: 40px;
line-height: 1;
color: var(--accent-color);
opacity: 0.3;
font-family: Georgia, serif;
}
#write blockquote p:first-child {
margin-top: 0;
}
#write blockquote p:last-child {
margin-bottom: 0;
}
.md-alert,
.admonition {
background-color: rgba(45, 45, 45, 0.4);
border-left: 3px solid var(--accent-color);
padding: 16px 20px 16px 48px;
margin: 24px 0;
border-radius: 5px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
position: relative;
}
.md-alert::before,
.admonition::before {
content: 'i';
position: absolute;
left: 14px;
top: 14px;
font-size: 24px;
line-height: 1;
color: var(--accent-color);
opacity: 0.4;
font-family: Georgia, serif;
font-style: italic;
}
.md-alert-note::before {
content: 'i';
}
.md-alert-tip::before {
content: '*';
font-style: normal;
}
.md-alert-important::before {
content: '!';
}
.md-alert-warning::before {
content: '‼';
font-style: normal;
}
.md-alert-caution::before {
content: '×';
font-style: normal;
}
.md-alert-text-container,
.md-alert-title {
display: none;
height: 0;
margin: 0;
padding: 0;
line-height: 0;
}
.md-alert p,
.admonition p {
margin: 0;
}
/* Math blocks */
.md-math-block:hover .md-math-container,
.md-math-block:hover .md-rawblock-tooltip,
.md-htmlblock:hover .md-htmlblock-container,
.md-htmlblock:hover .md-rawblock-tooltip,
.md-rawblock-on-edit:hover .md-rawblock-tooltip,
.md-rawblock-on-edit .md-mathblock-panel,
.md-rawblock-after,
.md-rawblock-before,
.md-rawblock-control:not(.md-rawblock-tooltip) {
background: var(--code-block-bg-color);
}
.md-rawblock-tooltip {
pointer-events: none;
background: var(--code-block-bg-color) !important;
}
.md-rawblock .md-rawblock-tooltip-edit-btn:hover {
background: rgba(0, 0, 0, 0);
}
/* Horizontal rules */
#write hr {
border: none;
height: 1px;
background-color: var(--border-color);
margin: 48px 0;
}
/* =========================================================================
4. Code & Syntax
========================================================================= */
/* Search highlight animation */
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.2);
}
100% {
transform: scale(1);
}
}
.md-search-hit,
.md-search-select {
display: inline-block !important;
border-radius: 8px !important;
padding: 0.8px 1.6px !important;
}
.md-search-hit {
color: var(--text-color) !important;
}
.md-search-select {
background: var(--search-highlight-bg) !important;
color: rgba(55, 53, 47, 1) !important;
transform-origin: center center !important;
animation: pulse 0.3s ease-in-out !important;
}
pre {
--monospace: "Cascadia Code Variable", SFMono-Regular, Menlo, Consolas,
"PT Mono", "Liberation Mono";
}
/* Code fences */
.md-fences {
position: relative;
margin: 20px 0 51.2px 0;
background: var(--code-block-bg-color);
border: 1px solid var(--code-border-color);
border-radius: 6px;
overflow: visible;
padding: 0;
font-size: var(--code-block-font-size);
transition: border-color 0.2s ease, box-shadow 0.2s ease, filter 0.2s ease;
contain: layout style;
will-change: border-color, box-shadow;
}
#write .cm-s-inner,
.cm-s-typora-default {
background: rgba(0, 0, 0, 0);
border-radius: 0;
padding: 20px 24px;
font-size: var(--code-block-font-size);
line-height: var(--code-block-line-height);
font-family: var(--monospace-font);
border: none;
}
#write .md-fences :is(pre, code),
.cm-s-typora-default :is(pre, code) {
font-family: var(--monospace-font);
font-size: var(--code-block-font-size);
line-height: var(--code-block-line-height);
background: rgba(0, 0, 0, 0);
}
#write .md-fences pre,
.cm-s-typora-default pre {
margin: 0;
white-space: pre-wrap;
word-wrap: break-word;
}
#write .md-fences code,
.cm-s-typora-default code {
display: block;
white-space: pre-wrap;
word-wrap: break-word;
word-break: break-word;
}
/* WYSIWYG mode hides gutters and line numbers. */
#write .cm-s-inner .CodeMirror-gutters {
width: 0;
opacity: 0;
pointer-events: none;
}
#write .cm-s-inner .CodeMirror-linenumber {
opacity: 0;
}
/* Source mode shows gutters and line numbers. */
.cm-s-typora-default .CodeMirror-gutters {
width: auto;
opacity: 1;
pointer-events: auto;
}
.cm-s-typora-default .CodeMirror-linenumber {
opacity: 1;
color: rgba(106, 214, 154, 1);
padding-right: 12px;
}
.cm-s-typora-default .CodeMirror-line {
padding-left: 6px;
}
#write .cm-s-inner .CodeMirror-cursor,
.cm-s-typora-default .CodeMirror-cursor {
border-left: 2px solid rgba(121, 192, 255, 1);
}
.cm-s-inner,
.cm-s-typora-default {
color: rgba(230, 237, 243, 1);
}
/* CodeMirror token colors. */
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-keyword, .cm-builtin) {
color: rgba(255, 123, 114, 1);
font-weight: 600;
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-def {
color: rgba(210, 168, 255, 1);
font-weight: 600;
}
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-variable, .cm-variable-2, .cm-variable-3) {
color: rgba(255, 166, 87, 1);
}
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-number, .cm-atom) {
color: rgba(121, 192, 255, 1);
font-weight: 500;
}
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-string, .cm-string-2) {
color: rgba(165, 214, 255, 1);
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-comment {
color: rgba(139, 148, 158, 1);
font-style: italic;
opacity: 0.9;
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-operator {
color: rgba(255, 123, 114, 1);
}
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-property, .cm-attribute) {
color: rgba(121, 192, 255, 1);
}
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-type, .cm-tag) {
color: rgba(126, 231, 135, 1);
font-weight: 500;
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-meta {
color: rgba(210, 168, 255, 1);
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-qualifier {
color: rgba(255, 166, 87, 1);
font-weight: 500;
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-bracket {
color: rgba(201, 209, 217, 1);
font-weight: 600;
}
:is(.cm-s-inner, .cm-s-typora-default) :is(.cm-error, .cm-invalidchar) {
color: rgba(248, 81, 73, 1);
text-decoration: wavy underline;
text-decoration-color: rgba(248, 81, 73, 1);
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-header {
color: rgba(121, 192, 255, 1);
font-weight: 600;
}
:is(.cm-s-inner, .cm-s-typora-default) .cm-special {
color: rgba(210, 168, 255, 1);
}
/* Code block toolbar. */
.md-fences .code-tooltip {
background-color: rgba(0, 0, 0, 0);
border-radius: 0;
padding: 0;
height: var(--code-tooltip-height);
display: flex;
align-items: center;
border: none;
box-shadow: none;
backdrop-filter: none;
opacity: 1;
transition: opacity 0.2s ease;
position: absolute;
bottom: calc(-1 * var(--code-tooltip-gap));
right: -5px;
top: auto;
}
#write .md-diagram-panel {
margin-top: calc(var(--code-tooltip-gap) + 5px);
margin-bottom: 59.2px;
}
/* Typora lacks :has; position tooltip below diagram fences. */
#write .md-fences:is([lang="mermaid"],
[lang="flowchart"],
[lang="sequence"],
[lang="gantt"],
[lang="classDiagram"],
[lang="stateDiagram"],
[lang="erDiagram"],
[lang="journey"],
[lang="pie"],
[lang="gitGraph"],
[lang="mindmap"],
[lang="timeline"],
[lang="js-sequence-diagram"],
[lang="flow"]) .code-tooltip {
right: -5px;
bottom: auto;
top: 100%;
margin-top: 5px;
}
.md-fences .code-tooltip :is(input, span) {
padding: 6px 10px;
border-radius: 5px;
margin: 0 3px;
font-size: 13.6px;
font-weight: 500;
transition: all 0.2s ease;
}
.md-fences .code-tooltip input {
background-color: rgba(0, 0, 0, 0);
border: 1px solid rgba(0, 0, 0, 0);
color: rgba(255, 255, 255, 0.6);
}
.md-fences .code-tooltip input:hover,
.md-fences .code-tooltip input:focus {
background-color: rgba(255, 255, 255, 0.05);
border-color: rgba(255, 255, 255, 0.2);
color: rgba(255, 255, 255, 0.9);
}
.md-fences .code-tooltip span {
cursor: pointer;
color: rgba(255, 255, 255, 0.7);
background-color: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.15);
font-weight: 500;
}
.md-fences .code-tooltip span:hover {
background-color: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 1);
border-color: rgba(255, 255, 255, 0.25);
transform: translateY(-1px);
}
.md-fences .code-tooltip span:active {
transform: translateY(0);
}
/* Autocomplete dropdown. */
.autoComplt-list {
width: 20ch !important;
border-radius: 6px !important;
background-color: rgba(43, 43, 43, 1) !important;
border: 1px solid var(--border-color) !important;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6);
overflow: hidden;
}
.autoComplt-hint {
background-color: rgba(0, 0, 0, 0) !important;
margin: 0 !important;
padding: 4px 12px !important;
color: var(--text-color) !important;
line-height: var(--line-height) !important;
height: auto !important;
cursor: pointer;
transition: background-color 0.15s ease;
}
.autoComplt-hint-selected {
background-color: rgba(61, 61, 61, 1) !important;
color: rgba(121, 192, 255, 1) !important;
}
/* =========================================================================
5. Inline Elements
========================================================================= */
/* Inline code. */
code {
font-family: var(--code-font);
font-size: var(--monospace-font-size);
line-height: var(--monospace-line-height);
color: var(--code-color);
background-color: var(--code-bg-color);
padding: 3.2px 6.4px;
border-radius: var(--code-border-radius);
border: none;
font-weight: 400;
}
/* Links. */
#write a {
text-decoration: none;
color: var(--link-color);
border-bottom: 1px solid rgba(0, 0, 0, 0);
padding: 0 2px;
margin: 0 -2px;
border-radius: 2px;
transition: color 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
}
#write a:hover {
color: var(--link-hover-color);
background-color: var(--link-hover-bg);
border-bottom-color: var(--link-hover-color);
}
#write a:focus {
outline: 2px solid var(--link-hover-color);
outline-offset: 2px;
background-color: var(--link-hover-bg);
}
#write a:active {
transform: translateY(1px) var(--gpu-acceleration);
}
/* Selection and marks. */
::selection {
background-color: var(--selection-bg);
color: var(--selection-color);
}
.cm-s-inner .CodeMirror-selected,
.cm-s-typora-default .CodeMirror-selected {
background: rgba(0, 0, 0, 0) !important;
}
.cm-s-inner .CodeMirror-selectedtext,
.cm-s-typora-default .CodeMirror-selectedtext {
background: var(--code-selection-bg) !important;
color: var(--code-selection-color) !important;
}
mark {
background-color: var(--highlight-bg);
color: rgba(55, 53, 47, 1);
padding: 2px 0;
border-radius: 0;
}
mark.yellow,
mark {
background-color: rgba(255, 238, 160, 1);
color: rgba(55, 53, 47, 1);
}
mark.red {
background-color: rgba(90, 44, 44, 1);
color: rgba(255, 184, 177, 1);
}
mark.blue {
background-color: rgba(43, 66, 87, 1);
color: rgba(156, 199, 232, 1);
}
mark.green {
background-color: rgba(43, 74, 63, 1);
color: rgba(147, 225, 200, 1);
}
mark.orange {
background-color: rgba(89, 74, 58, 1);
color: rgba(255, 204, 153, 1);
}
mark.purple {
background-color: rgba(68, 63, 87, 1);
color: rgba(212, 197, 249, 1);
}
mark.pink {
background-color: rgba(83, 59, 71, 1);
color: rgba(255, 184, 210, 1);
}
mark.brown {
background-color: rgba(67, 64, 64, 1);
color: rgba(212, 196, 176, 1);
}
mark.gray {
background-color: rgba(58, 58, 58, 1);
color: rgba(193, 193, 193, 1);
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
/* =========================================================================
6. Sidebar & Navigation
========================================================================= */
/* Table of contents. */
#write div.md-toc-tooltip {
background-color: var(--bg-color);
}
.md-toc {
margin-top: 40px;
}
.md-toc .md-toc-h2 {
margin-left: 16px;
}
.md-toc .md-toc-h3 {
margin-left: 32px;
}
.md-toc .md-toc-h4 {
margin-left: 48px;
}
.md-toc .md-toc-h5 {
margin-left: 64px;
}
.md-toc .md-toc-h6 {
margin-left: 80px;
}
.sidebar-footer {
border-top: 1px solid var(--side-bar-border-color);
}
.pin-outline #typora-sidebar {
box-shadow: none;
border-right: 1px solid var(--side-bar-border-color);
}
.sidebar-tabs {
border-bottom: 1px solid var(--side-bar-border-color) !important;
}
/* Outline tree. */
.outline-content {
padding: 16px;
font-size: 14px !important;
}
.outline-content li {
position: relative;
z-index: 30;
line-height: 1.3 !important;
margin-bottom: 0;
}
.outline-content li::before {
content: "";
width: 1px;
height: calc(100% + 5px);
position: absolute;
z-index: 30;
left: 0;
top: 0;
border-left: 1px solid var(--border-color);
}
.outline-content>li:first-of-type::before {
top: 0;
}
.outline-content li a {
font-size: 14px !important;
}
.outline-content li ul {
margin-left: 20px;
margin-top: 0 !important;
position: relative;
z-index: 48;
}
.outline-content ul li::before {
content: "";
width: 1px;
height: calc(100% + 10px);
top: -10px;
border-left: 1px solid var(--border-color);
}
.outline-content ul>li:last-of-type::before {
content: "";
width: 1px;
height: 10px;
top: -10px;
left: 0;
border-left: 1px solid var(--border-color);
}
.outline-content li .outline-item {
margin: 0 0 3px 7px;
padding: 4px 8px;
position: relative;
z-index: 50;
border-radius: 5px;
border: 1px solid rgba(0, 0, 0, 0);
}
.outline-item>.outline-label {
text-decoration: none;
}
.outline-content li .outline-item:hover,
.outline-content li .outline-item-active {
z-index: 70;
}
.outline-content li .outline-item::before {
content: "";
width: 12px;
height: calc(50% + 12px);
position: absolute;
z-index: 38;
left: -8px;
top: -11.5px;
background: rgba(0, 0, 0, 0);
border-left: 1px solid var(--border-color);
border-bottom: 1px solid var(--border-color);
}
.outline-content>li:first-of-type>.outline-item::before {
top: calc(50% - 1px) !important;
border-top: 1px solid var(--border-color);
border-bottom: none;
border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-bottom-left-radius: 0;
-webkit-border-bottom-left-radius: 0;
}
.outline-content>li:first-of-type>.outline-item::after {
content: "";
width: 1px;
height: 100%;
position: absolute;
z-index: 35;
left: -8px;
top: -2px;
border-left: 1px solid var(--bg-color);
}
.outline-content>li:last-of-type>.outline-item::before,
.outline-content>li ul>li:last-of-type>.outline-item::before {
z-index: 90;
background: rgba(0, 0, 0, 0);
border-left: 1px solid var(--border-color);
border-bottom: 1px solid var(--border-color);
border-top: none !important;
border-bottom-left-radius: 3px;
-webkit-border-bottom-left-radius: 3px;
border-top-left-radius: 0;
-webkit-border-top-left-radius: 0;
}
.outline-content>li:only-of-type>.outline-item::before,
.outline-content>li:last-of-type::before {
display: none;
}
.outline-content>li:only-of-type {
margin-left: -6px;
}
.outline-expander {
padding-left: 0;
width: auto;
height: 8px;
background: rgba(0, 0, 0, 0);
}
.outline-expander:before {
font-size: 10px;
padding: 0 4px 0 2px;
margin-top: -2px;
margin-left: -2px;
background: rgba(0, 0, 0, 0);
}
.outline-item:hover,
.outline-item:hover>.outline-expander:before,
.outline-item:hover>.outline-expander {
background: var(--active-file-bg-color) !important;
color: var(--text-color) !important;
}
li>.outline-item-active {
background: var(--active-file-bg-color);
}
.outline-item:hover::before,
.outline-item-active::before {
width: 7px !important;
}
.outline-item-active .outline-expander {
font-weight: 900 !important;
}
.ty-on-outline-filter .outline-content li::before,
.ty-on-outline-filter .outline-content .outline-item::before,
.ty-on-outline-filter .outline-content .outline-item::after {
display: none;
}
.ty-on-outline-filter .outline-content>li>ul,
.ty-on-outline-filter .outline-content .outline-item {
margin-left: 0;
}
/* =========================================================================
7. Typora Chrome
========================================================================= */
/* File library list and search. */
#file-library-list,
#file-library-search-result {
padding: 12px;
}
#file-library-list .file-list-item,
#file-library-search-result .ty-search-item {
margin-bottom: 8px;
border: 1px solid rgba(0, 0, 0, 0);
border-bottom-color: var(--border-color);
}
#file-library-list .file-list-item {
padding-left: 12px;
padding-right: 12px;
}
#file-library-list .file-list-item.active,
#file-library-search-result .ty-search-item.active {
border-radius: 5px;
border: 1px solid var(--text-color);
}
#file-library-list .file-list-item.active {
padding: 6px 12px;
}
#file-library-search-result .ty-search-item.active {
padding: 6px 12px 6px 0;
}
#file-library-list .file-list-item:first-of-type.active,
#file-library-search-result .ty-search-item:first-of-type.active {
margin-top: 0;
}
#file-library-list .file-list-item:hover,
#file-library-search-result .ty-search-item:hover {
border-radius: 5px;
background: var(--active-file-bg-color);
border-color: var(--border-color);
}
#file-library-search-result .ty-search-item.active {
color: var(--text-color);
}
#file-library-search-result .ty-search-item.active .ty-search-item-line {
white-space: normal;
word-break: break-word;
}
.file-list-item-time {
margin-right: 0;
padding-right: 0;
}
.file-list-item-count {
margin-right: 0;
padding: 0 6px;
border-radius: 3px;
}
#file-library-search-result .ty-search-item.active .file-list-item-count {
padding-right: 0;
}
#sidebar-loading-template {
padding: 8px;
border-radius: 5px;
margin-bottom: 5px;
display: none;
}
.ty-file-search-match-text {
background-color: var(--color-2-0-c);
}
/* File tree. */
#file-library-tree {
padding-top: 9.1424px;
padding-left: 13.7136px;
padding-right: 13.7136px;
box-sizing: border-box;
font-size: var(--file-tree-font-size);
}
.sidebar-tab-btn {
font-size: 18.2864px !important;
line-height: 22.8576px !important;
vertical-align: text-top;
margin-top: 13.7136px !important;
color: var(--title-color);
}
.ty-sidebar-search-panel .searchpanel-search-option-btn {
top: 9.1424px;
}
.file-tree-node {
position: relative;
padding-left: 0;
margin-left: 0;
}
.file-library-file-node:hover .file-node-icon:after {
width: 9.1424px !important;
}
.file-node-expanded>.file-node-children {
margin-left: 33.7136px;
}
.file-tree-node>.file-node-background {
border-radius: 5.7136px;
margin-left: -13.7136px;
border: none !important;
}
#file-library-tree .file-node-root>.file-node-content {
margin-left: -3.4288px !important;
}
#file-library-tree .file-tree-node>.file-node-content {
margin-left: -17.1424px;
}
#file-library-tree .file-node-collapsed>.file-node-content,
#file-library-tree .file-node-expanded>.file-node-content {
margin-left: -10.2864px;
}
.file-library-node:not(.file-node-root):focus>.file-node-content {
outline: none;
}
.os-windows #file-library-tree .file-node-content {
padding-right: 42.2864px;
margin-bottom: 3.4288px;
}
.file-library-node:not(.file-node-root):focus>.file-node-background,
.file-library-node.active:not(.file-node-root):focus>.file-node-background {
border: 1px dashed var(--text-color) !important;
}
.fa-folder:before,
.fa-folder:after,
.fa-caret-right,
.fa-caret-down {
color: var(--text-grey);
}
.file-node-content .file-node-title {
padding-right: 10.2864px;
}
.file-library-file-node.active .file-node-title {
font-weight: 700;
}
#file-library-tree .file-node-root>.file-node-children {
margin-left: 30.2864px;
}
#file-library-tree .file-tree-node {
position: relative;
}
.file-node-expanded>.file-node-content .fa-caret-down {
margin-right: 1.1424px;
}
#file-library-tree .file-tree-node .file-node-icon {
padding-left: 3.4288px;
}
#file-library-tree .file-node-open-state i {
position: relative;
z-index: 30;
padding-left: 4.5712px;
}
#file-library-tree .file-node-content::before {
content: "";
position: absolute;
z-index: 20;
left: -22.8576px;
top: -9.1424px;
display: block;
width: 1.1424px;
height: calc(100% + 5.7136px);
border-left: 1px solid var(--border-color);
}
#file-library-tree .file-node-content>.file-node-icon::before {
position: relative;
z-index: 35;
}
#file-library-tree .file-node-content>.file-node-icon::after {
content: "";
position: absolute;
z-index: 20;
left: -22.8576px;
top: 16px;
width: 13.7136px;
height: 18.2864px;
border-left: 1px solid var(--border-color);
border-top: 1px solid var(--border-color);
background: rgba(0, 0, 0, 0);
}
#file-library-tree .active>.file-node-content>.file-node-icon::after {
width: 9.1424px;
}
#file-library-tree .file-node-expanded>.file-node-content>.file-node-icon::after {
left: -22.8576px;
top: 17.1424px;
width: 9.1424px;
}
#file-library-tree .file-node-collapsed>.file-node-content>.file-node-icon::after {
left: -22.8576px;
top: 16px;
width: 13.7136px;
}
.os-windows #file-library-tree .file-node-collapsed>.file-node-content>.file-node-icon::after {
top: 17.1424px;
}
#file-library-tree .file-node-children>div:last-of-type>.file-node-content>.file-node-icon::after {
border-top: none;
border-bottom: 1px solid var(--border-color);
border-bottom-left-radius: 3.4288px;
top: -1.1424px;
}
#file-library-tree .file-node-children>div:last-of-type>.file-node-content::before {
height: 11.4288px;
top: -10.2864px;
}
.file-node-root>.file-node-content>.file-node-icon::after {
display: none;
}
.file-node-content {
padding: 4px 8px;
display: flex;
align-items: center;
height: 24px;
}
.file-node-background {
height: 24px;
border-radius: 4px;
}
.file-library-node {
margin: 4px 0;
}
.file-library-file-node:hover .file-node-background,
.file-library-file-node.active .file-node-background {
background: var(--active-file-bg-color);
border-radius: 4px;
height: 24px;
display: flex;
align-items: center;
}
.file-library-file-node:hover .file-node-content,
.file-library-file-node.active .file-node-content {
cursor: pointer;
}
/* =========================================================================
8. Utilities & Export
========================================================================= */
/* Print/PDF export overrides. */
@media print {
.typora-export * {
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
}
:root {
--font-size: 11pt;
--bg-color: rgba(255, 255, 255, 1);
--text-color: rgba(0, 0, 0, 1);
--link-color: rgba(127, 179, 255, 1);
}
body {
max-width: 100%;
margin: 0;
padding: 0;
background: white;
color: black;
}
#write {
padding: 1cm 1.5cm;
max-width: 100%;
margin: 0;
}
#write img,
#write table,
#write blockquote,
#write .md-fences {
box-shadow: none !important;
border: 1px solid rgba(221, 221, 221, 1) !important;
}
* {
animation: none !important;
transition: none !important;
will-change: auto !important;
}
.typora-export .mermaid svg,
.typora-export .mermaid svg * {
transform-box: fill-box;
transform-origin: center;
}
.typora-export .md-diagram-panel {
background: rgba(0, 0, 0, 0) !important;
border: none !important;
box-shadow: none !important;
padding: 0 !important;
}
.typora-export .md-diagram-panel svg {
width: 100% !important;
height: auto !important;
overflow: visible !important;
}
.typora-export .md-diagram-panel svg text,
.typora-export .md-diagram-panel svg tspan {
fill: rgba(17, 17, 17, 1) !important;
}
.typora-export .md-diagram-panel svg foreignObject {
overflow: visible !important;
}
#write img,
#write .md-task-list-item>input {
will-change: auto !important;
transform: none !important;
}
#write a {
will-change: auto !important;
}
#write img {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2) !important;
}
#write hr::before,
#write blockquote::before {
display: none !important;
}
#write h1 {
page-break-before: always;
break-before: page;
}
#write h1:first-of-type,
#write>h1:first-child {
page-break-before: auto;
break-before: auto;
}
#write hr {
page-break-after: always;
break-after: page;
margin-bottom: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
page-break-after: avoid;
break-after: avoid;
page-break-inside: avoid;
break-inside: avoid;
}
#write table,
#write .md-fences,
#write blockquote,
#write img {
page-break-inside: avoid;
break-inside: avoid;
}
p,
li {
orphans: 3;
widows: 3;
}
#write a {
text-decoration: underline;
color: var(--link-color);
border: none;
background: none;
}
.code-tooltip,
.md-fences .code-tooltip,
sup.md-footnote:hover {
display: none !important;
}
#write img {
max-width: 100%;
page-break-inside: avoid;
break-inside: avoid;
display: block;
margin: 16px auto;
}
#write .md-fences {
background: rgba(248, 248, 248, 1) !important;
border: 1px solid rgba(221, 221, 221, 1) !important;
padding: 0.3cm !important;
font-size: 9pt;
page-break-inside: avoid;
}
#write .cm-s-inner {
padding: 0.3cm !important;
background: rgba(248, 248, 248, 1) !important;
}
#write .cm-s-inner .cm-keyword,
#write .cm-s-inner .cm-builtin {
color: rgba(215, 58, 73, 1) !important;
font-weight: 600;
}
#write .cm-s-inner .cm-def {
color: rgba(111, 66, 193, 1) !important;
font-weight: 600;
}
#write .cm-s-inner .cm-variable,
#write .cm-s-inner .cm-variable-2,
#write .cm-s-inner .cm-variable-3 {
color: rgba(36, 41, 46, 1) !important;
}
#write .cm-s-inner .cm-number,
#write .cm-s-inner .cm-atom {
color: rgba(0, 92, 197, 1) !important;
font-weight: 500;
}
#write .cm-s-inner .cm-string,
#write .cm-s-inner .cm-string-2 {
color: rgba(34, 134, 58, 1) !important;
}
#write .cm-s-inner .cm-comment {
color: rgba(106, 115, 125, 1) !important;
font-style: italic;
}
#write .cm-s-inner .cm-operator {
color: rgba(215, 58, 73, 1) !important;
}
#write .cm-s-inner .cm-property,
#write .cm-s-inner .cm-attribute {
color: rgba(0, 92, 197, 1) !important;
}
#write .cm-s-inner .cm-type,
#write .cm-s-inner .cm-tag {
color: rgba(34, 134, 58, 1) !important;
font-weight: 500;
}
#write .cm-s-inner .cm-meta {
color: rgba(111, 66, 193, 1) !important;
}
#write .cm-s-inner .cm-qualifier {
color: rgba(111, 66, 193, 1) !important;
font-weight: 500;
}
#write .cm-s-inner .cm-bracket {
color: rgba(36, 41, 46, 1) !important;
font-weight: 600;
}
#write .cm-s-inner .cm-error {
color: rgba(215, 58, 73, 1) !important;
background-color: rgba(215, 58, 73, 0.1) !important;
}
#write .cm-s-inner .cm-header {
color: rgba(0, 92, 197, 1) !important;
font-weight: 600;
}
#write .cm-s-inner .cm-special {
color: rgba(111, 66, 193, 1) !important;
}
#write table {
border-collapse: collapse !important;
width: 100% !important;
font-size: 10pt;
}
#write td,
#write th {
border: 1px solid rgba(221, 221, 221, 1) !important;
padding: 0.3cm !important;
}
#write blockquote {
background: rgba(245, 245, 245, 1) !important;
border-left: 4px solid rgba(102, 102, 102, 1) !important;
padding: 0.5cm !important;
page-break-inside: avoid;
}
#write blockquote::before {
display: none;
}
.sidebar,
.file-tree,
#typora-sidebar,
.outline,
.md-search-panel {
display: none !important;
}
}
/* Normalize inline-styled workflow blocks from HTML exports. */
#write .md-htmlblock-container {
background: rgba(0, 0, 0, 0) !important;
box-shadow: none !important;
border: 0 !important
}
#write div[style*="border:1px solid #ccc"][style*="padding: 15px"],
#write div[style*="background-color: #f9f9f9"],
#write div[style*="background-color:#f9f9f9"],
#write div[style*="background-color: rgb(249, 249, 249)"],
#write div[style*="background-color:rgb(249, 249, 249)"] {
background: rgba(32, 34, 37, 1) !important;
border-color: rgba(78, 78, 78, 1) !important;
color: rgba(234, 234, 234, 1) !important;
box-shadow: 0 0 0 1px rgba(0, 0, 0, .35) inset !important;
}
#write div[style*="border:1px solid #aaa"] {
background: rgba(43, 43, 44, 1) !important;
border-color: rgba(106, 106, 106, 1) !important;
color: rgba(243, 243, 243, 1) !important
}
#write [style*="background-color: #e0e0ff"],
#write [style*="background-color:#e0e0ff"],
#write [style*="background-color: rgb(224, 224, 255)"] {
background: rgba(47, 58, 122, 1) !important;
border-color: rgba(136, 146, 214, 1) !important;
color: rgba(238, 241, 255, 1) !important
}
#write [style*="background-color: #e0ffe0"],
#write [style*="background-color:#e0ffe0"],
#write [style*="background-color: rgb(224, 255, 224)"] {
background: rgba(31, 74, 31, 1) !important;
border-color: rgba(95, 201, 102, 1) !important;
color: rgba(230, 255, 230, 1) !important
}
#write div[style*="font-size: 20px"] {
background: rgba(0, 0, 0, 0) !important;
border: 0 !important;
color: rgba(207, 207, 207, 1) !important
}
#write .md-htmlblock-container *,
#write div[style*="padding: 15px"] * {
opacity: 1 !important;
filter: none !important;
mix-blend-mode: normal !important;
color: inherit !important
}
/* Strikethrough. */
s,
del,
.del {
color: rgba(212, 212, 212, 0.5);
text-decoration: line-through;
text-decoration-thickness: 2px;
text-underline-offset: 3px;
}
/* Footnote references. */
#write sup.md-footnote {
background-color: rgba(212, 212, 212, 0.9);
color: rgba(32, 32, 32, 0.95);
padding: 1px 5px;
border-radius: 3px;
margin: 0 1px;
font-weight: 600;
font-size: 0.75em;
cursor: pointer;
transition: all 0.2s ease;
border: 1px solid rgba(0, 0, 0, 0);
vertical-align: baseline;
}
#write sup.md-footnote:hover {
background-color: var(--accent-color);
color: var(--bg-color);
box-shadow: 0 1px 4px rgba(156, 166, 168, 0.3);
border-color: var(--accent-color);
}
#write .md-footnote {
font-size: inherit;
line-height: inherit;
color: inherit;
}
#write .md-footnote::before {
display: none;
}
#write .md-footnote:hover {
color: var(--accent-color);
}
#write .footnotes-sep {
display: none;
}
#write .footnotes {
margin: 0;
padding: 0;
}
#write .footnotes ol {
padding-left: 24px;
margin: 0;
}
#write .footnotes li {
margin: 0;
padding: 0;
color: rgba(212, 212, 212, 0.9);
font-size: 15px;
line-height: 1.6;
}
</style>
<style type='text/css' id="style-lp">ol, ul {padding-left: 40px}</style>
<title>01_data_loading</title>
</head>
<body class='typora-export os-windows typora-export-show-outline typora-export-no-collapse-outline'><div class='typora-export-content'>
<div class="typora-export-sidebar"><div class="outline-content"><li class="outline-item-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#01---mnist-data-loading--duckdb-storage">01 - MNIST Data Loading &amp; DuckDB Storage</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#load-mnist-idx-files">Load MNIST IDX Files</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#store-in-duckdb">Store in DuckDB</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#explore-with-sql">Explore with SQL</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#visualize-sample-digits">Visualize Sample Digits</a></div><ul class="outline-children"></ul></li></ul></li></div></div><div id='write' class=''><h1 id='01---mnist-data-loading--duckdb-storage'><span>01 - MNIST Data Loading &amp; DuckDB Storage</span></h1><p><span>This notebook:</span></p><ol start='' ><li><p><span>Reads raw MNIST IDX binary files</span></p></li><li><p><span>Stores them in DuckDB for fast SQL-based exploration</span></p></li><li><p><span>Visualizes sample digits</span></p></li></ol><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">numpy</span> <span class="cm-keyword">as</span> <span class="cm-variable">np</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">pandas</span> <span class="cm-keyword">as</span> <span class="cm-variable">pd</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">duckdb</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">struct</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">matplotlib</span>.<span class="cm-property">pyplot</span> <span class="cm-keyword">as</span> <span class="cm-variable">plt</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">from</span> <span class="cm-variable">pathlib</span> <span class="cm-keyword">import</span> <span class="cm-variable">Path</span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 150px;"></div><div class="CodeMirror-gutters" style="display: none; height: 150px;"></div></div></div></pre><h2 id='load-mnist-idx-files'><span>Load MNIST IDX Files</span></h2><p><span>The IDX format stores images as raw bytes with a header containing dimensions.</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">read_idx_images</span>(<span class="cm-variable">path</span>):</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">with</span> <span class="cm-builtin">open</span>(<span class="cm-variable">path</span>, <span class="cm-string">'rb'</span>) <span class="cm-keyword">as</span> <span class="cm-variable">f</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">magic</span>, <span class="cm-variable">n</span>, <span class="cm-variable">rows</span>, <span class="cm-variable">cols</span> <span class="cm-operator">=</span> <span class="cm-variable">struct</span>.<span class="cm-property">unpack</span>(<span class="cm-string">'&gt;IIII'</span>, <span class="cm-variable">f</span>.<span class="cm-property">read</span>(<span class="cm-number">16</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">np</span>.<span class="cm-property">frombuffer</span>(<span class="cm-variable">f</span>.<span class="cm-property">read</span>(), <span class="cm-variable">dtype</span><span class="cm-operator">=</span><span class="cm-variable">np</span>.<span class="cm-property">uint8</span>).<span class="cm-property">reshape</span>(<span class="cm-variable">n</span>, <span class="cm-variable">rows</span> <span class="cm-operator">*</span> <span class="cm-variable">cols</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">read_idx_labels</span>(<span class="cm-variable">path</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">with</span> <span class="cm-builtin">open</span>(<span class="cm-variable">path</span>, <span class="cm-string">'rb'</span>) <span class="cm-keyword">as</span> <span class="cm-variable">f</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">magic</span>, <span class="cm-variable">n</span> <span class="cm-operator">=</span> <span class="cm-variable">struct</span>.<span class="cm-property">unpack</span>(<span class="cm-string">'&gt;II'</span>, <span class="cm-variable">f</span>.<span class="cm-property">read</span>(<span class="cm-number">8</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">np</span>.<span class="cm-property">frombuffer</span>(<span class="cm-variable">f</span>.<span class="cm-property">read</span>(), <span class="cm-variable">dtype</span><span class="cm-operator">=</span><span class="cm-variable">np</span>.<span class="cm-property">uint8</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">data_dir</span> <span class="cm-operator">=</span> <span class="cm-variable">Path</span>(<span class="cm-string">'../data'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">train_images</span> <span class="cm-operator">=</span> <span class="cm-variable">read_idx_images</span>(<span class="cm-variable">data_dir</span> <span class="cm-operator">/</span> <span class="cm-string">'train-images.idx3-ubyte'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">train_labels</span> <span class="cm-operator">=</span> <span class="cm-variable">read_idx_labels</span>(<span class="cm-variable">data_dir</span> <span class="cm-operator">/</span> <span class="cm-string">'train-labels.idx1-ubyte'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">test_images</span> <span class="cm-operator">=</span> <span class="cm-variable">read_idx_images</span>(<span class="cm-variable">data_dir</span> <span class="cm-operator">/</span> <span class="cm-string">'t10k-images.idx3-ubyte'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">test_labels</span> <span class="cm-operator">=</span> <span class="cm-variable">read_idx_labels</span>(<span class="cm-variable">data_dir</span> <span class="cm-operator">/</span> <span class="cm-string">'t10k-labels.idx1-ubyte'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-builtin">print</span>(<span class="cm-string">f'Train: </span>{<span class="cm-variable">train_images</span>.<span class="cm-property">shape</span>[<span class="cm-number">0</span>]}<span class="cm-string"> images, </span>{<span class="cm-variable">train_images</span>.<span class="cm-property">shape</span>[<span class="cm-number">1</span>]}<span class="cm-string"> pixels each'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-builtin">print</span>(<span class="cm-string">f'Test: &nbsp;</span>{<span class="cm-variable">test_images</span>.<span class="cm-property">shape</span>[<span class="cm-number">0</span>]}<span class="cm-string"> images'</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 451px;"></div><div class="CodeMirror-gutters" style="display: none; height: 451px;"></div></div></div></pre><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang=""><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">Train: 60000 images, 784 pixels each</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">Test: 10000 images</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 50px;"></div><div class="CodeMirror-gutters" style="display: none; height: 50px;"></div></div></div></pre><h2 id='store-in-duckdb'><span>Store in DuckDB</span></h2><p><span>We store pixel data as a flat array (784 columns for 28x28) plus the label. This lets us query and filter with SQL.</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">db_path</span> <span class="cm-operator">=</span> <span class="cm-builtin">str</span>(<span class="cm-variable">data_dir</span> <span class="cm-operator">/</span> <span class="cm-string">'mnist.duckdb'</span>)</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">con</span> <span class="cm-operator">=</span> <span class="cm-variable">duckdb</span>.<span class="cm-property">connect</span>(<span class="cm-variable">db_path</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Create train table</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">train_df</span> <span class="cm-operator">=</span> <span class="cm-variable">pd</span>.<span class="cm-property">DataFrame</span>(<span class="cm-variable">train_images</span>, <span class="cm-variable">columns</span><span class="cm-operator">=</span>[<span class="cm-string">f'px</span>{<span class="cm-variable">i</span>}<span class="cm-string">'</span> <span class="cm-keyword">for</span> <span class="cm-variable">i</span> <span class="cm-keyword">in</span> <span class="cm-builtin">range</span>(<span class="cm-number">784</span>)])</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">train_df</span>[<span class="cm-string">'label'</span>] <span class="cm-operator">=</span> <span class="cm-variable">train_labels</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">train_df</span>[<span class="cm-string">'split'</span>] <span class="cm-operator">=</span> <span class="cm-string">'train'</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Create test table</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">test_df</span> <span class="cm-operator">=</span> <span class="cm-variable">pd</span>.<span class="cm-property">DataFrame</span>(<span class="cm-variable">test_images</span>, <span class="cm-variable">columns</span><span class="cm-operator">=</span>[<span class="cm-string">f'px</span>{<span class="cm-variable">i</span>}<span class="cm-string">'</span> <span class="cm-keyword">for</span> <span class="cm-variable">i</span> <span class="cm-keyword">in</span> <span class="cm-builtin">range</span>(<span class="cm-number">784</span>)])</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">test_df</span>[<span class="cm-string">'label'</span>] <span class="cm-operator">=</span> <span class="cm-variable">test_labels</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">test_df</span>[<span class="cm-string">'split'</span>] <span class="cm-operator">=</span> <span class="cm-string">'test'</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Combine and write</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">all_df</span> <span class="cm-operator">=</span> <span class="cm-variable">pd</span>.<span class="cm-property">concat</span>([<span class="cm-variable">train_df</span>, <span class="cm-variable">test_df</span>], <span class="cm-variable">ignore_index</span><span class="cm-operator">=</span><span class="cm-keyword">True</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">con</span>.<span class="cm-property">execute</span>(<span class="cm-string">'DROP TABLE IF EXISTS mnist'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">con</span>.<span class="cm-property">execute</span>(<span class="cm-string">'CREATE TABLE mnist AS SELECT * FROM all_df'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-builtin">print</span>(<span class="cm-string">f'Stored </span>{<span class="cm-builtin">len</span>(<span class="cm-variable">all_df</span>)}<span class="cm-string"> records in DuckDB'</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 451px;"></div><div class="CodeMirror-gutters" style="display: none; height: 451px;"></div></div></div></pre><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang=""><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">Stored 70000 records in DuckDB</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 25px;"></div><div class="CodeMirror-gutters" style="display: none; height: 25px;"></div></div></div></pre><h2 id='explore-with-sql'><span>Explore with SQL</span></h2><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Label distribution</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">con</span>.<span class="cm-property">execute</span>(<span class="cm-string">"""</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; SELECT label, split, COUNT(*) as count</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; FROM mnist</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; GROUP BY label, split</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; ORDER BY label, split</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string">"""</span>).<span class="cm-property">df</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 176px;"></div><div class="CodeMirror-gutters" style="display: none; height: 176px;"></div></div></div></pre><p>&nbsp;</p><figure class='table-figure'><table><thead><tr><th>&nbsp;</th><th><span>label</span></th><th><span>split</span></th><th><span>count</span></th></tr></thead><tbody><tr><td><span>0</span></td><td><span>0</span></td><td><span>test</span></td><td><span>980</span></td></tr><tr><td><span>1</span></td><td><span>0</span></td><td><span>train</span></td><td><span>5923</span></td></tr><tr><td><span>2</span></td><td><span>1</span></td><td><span>test</span></td><td><span>1135</span></td></tr><tr><td><span>3</span></td><td><span>1</span></td><td><span>train</span></td><td><span>6742</span></td></tr><tr><td><span>4</span></td><td><span>2</span></td><td><span>test</span></td><td><span>1032</span></td></tr><tr><td><span>5</span></td><td><span>2</span></td><td><span>train</span></td><td><span>5958</span></td></tr><tr><td><span>6</span></td><td><span>3</span></td><td><span>test</span></td><td><span>1010</span></td></tr><tr><td><span>7</span></td><td><span>3</span></td><td><span>train</span></td><td><span>6131</span></td></tr><tr><td><span>8</span></td><td><span>4</span></td><td><span>test</span></td><td><span>982</span></td></tr><tr><td><span>9</span></td><td><span>4</span></td><td><span>train</span></td><td><span>5842</span></td></tr><tr><td><span>10</span></td><td><span>5</span></td><td><span>test</span></td><td><span>892</span></td></tr><tr><td><span>11</span></td><td><span>5</span></td><td><span>train</span></td><td><span>5421</span></td></tr><tr><td><span>12</span></td><td><span>6</span></td><td><span>test</span></td><td><span>958</span></td></tr><tr><td><span>13</span></td><td><span>6</span></td><td><span>train</span></td><td><span>5918</span></td></tr><tr><td><span>14</span></td><td><span>7</span></td><td><span>test</span></td><td><span>1028</span></td></tr><tr><td><span>15</span></td><td><span>7</span></td><td><span>train</span></td><td><span>6265</span></td></tr><tr><td><span>16</span></td><td><span>8</span></td><td><span>test</span></td><td><span>974</span></td></tr><tr><td><span>17</span></td><td><span>8</span></td><td><span>train</span></td><td><span>5851</span></td></tr><tr><td><span>18</span></td><td><span>9</span></td><td><span>test</span></td><td><span>1009</span></td></tr><tr><td><span>19</span></td><td><span>9</span></td><td><span>train</span></td><td><span>5949</span></td></tr></tbody></table></figure><p>&nbsp;</p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Average pixel intensity per digit</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">con</span>.<span class="cm-property">execute</span>(<span class="cm-string">"""</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; SELECT label,</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ROUND(AVG(px196::INT + px197::INT + px224::INT + px225::INT), 1) as center_intensity</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; FROM mnist WHERE split='train'</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; GROUP BY label ORDER BY label</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string">"""</span>).<span class="cm-property">df</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 176px;"></div><div class="CodeMirror-gutters" style="display: none; height: 176px;"></div></div></div></pre><p>&nbsp;</p><figure class='table-figure'><table><thead><tr><th>&nbsp;</th><th><span>label</span></th><th><span>center_intensity</span></th></tr></thead><tbody><tr><td><span>0</span></td><td><span>0</span></td><td><span>0.0</span></td></tr><tr><td><span>1</span></td><td><span>1</span></td><td><span>0.0</span></td></tr><tr><td><span>2</span></td><td><span>2</span></td><td><span>0.0</span></td></tr><tr><td><span>3</span></td><td><span>3</span></td><td><span>0.1</span></td></tr><tr><td><span>4</span></td><td><span>4</span></td><td><span>0.0</span></td></tr><tr><td><span>5</span></td><td><span>5</span></td><td><span>0.0</span></td></tr><tr><td><span>6</span></td><td><span>6</span></td><td><span>0.0</span></td></tr><tr><td><span>7</span></td><td><span>7</span></td><td><span>0.6</span></td></tr><tr><td><span>8</span></td><td><span>8</span></td><td><span>0.0</span></td></tr><tr><td><span>9</span></td><td><span>9</span></td><td><span>0.0</span></td></tr></tbody></table></figure><p>&nbsp;</p><h2 id='visualize-sample-digits'><span>Visualize Sample Digits</span></h2><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">fig</span>, <span class="cm-variable">axes</span> <span class="cm-operator">=</span> <span class="cm-variable">plt</span>.<span class="cm-property">subplots</span>(<span class="cm-number">2</span>, <span class="cm-number">5</span>, <span class="cm-variable">figsize</span><span class="cm-operator">=</span>(<span class="cm-number">10</span>, <span class="cm-number">4</span>))</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">for</span> <span class="cm-variable">digit</span> <span class="cm-keyword">in</span> <span class="cm-builtin">range</span>(<span class="cm-number">10</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">row</span> <span class="cm-operator">=</span> <span class="cm-variable">con</span>.<span class="cm-property">execute</span>(<span class="cm-string">f"SELECT * FROM mnist WHERE label=</span>{<span class="cm-variable">digit</span>}<span class="cm-string"> AND split='train' LIMIT 1"</span>).<span class="cm-property">fetchone</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pixels</span> <span class="cm-operator">=</span> <span class="cm-variable">np</span>.<span class="cm-property">array</span>(<span class="cm-variable">row</span>[:<span class="cm-number">784</span>]).<span class="cm-property">reshape</span>(<span class="cm-number">28</span>, <span class="cm-number">28</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">ax</span> <span class="cm-operator">=</span> <span class="cm-variable">axes</span>[<span class="cm-variable">digit</span> <span class="cm-operator">//</span> <span class="cm-number">5</span>, <span class="cm-variable">digit</span> <span class="cm-operator">%</span> <span class="cm-number">5</span>]</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">ax</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">pixels</span>, <span class="cm-variable">cmap</span><span class="cm-operator">=</span><span class="cm-string">'gray'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">ax</span>.<span class="cm-property">set_title</span>(<span class="cm-string">f'Label: </span>{<span class="cm-variable">digit</span>}<span class="cm-string">'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">ax</span>.<span class="cm-property">axis</span>(<span class="cm-string">'off'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">tight_layout</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">show</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 276px;"></div><div class="CodeMirror-gutters" style="display: none; height: 276px;"></div></div></div></pre><p><span> </span><br/><img src="../01_data_loading_files/01_data_loading_10_0.png" alt="png">
<span> </span></p><p>&nbsp;</p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># Pixel intensity heatmap averaged across all training images</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">avg_pixels</span> <span class="cm-operator">=</span> <span class="cm-variable">con</span>.<span class="cm-property">execute</span>(<span class="cm-string">"""</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string"> &nbsp; SELECT {} FROM mnist WHERE split='train'</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-string">"""</span>.<span class="cm-property">format</span>(<span class="cm-string">', '</span>.<span class="cm-property">join</span>(<span class="cm-string">f'AVG(px</span>{<span class="cm-variable">i</span>}<span class="cm-string">) as px</span>{<span class="cm-variable">i</span>}<span class="cm-string">'</span> <span class="cm-keyword">for</span> <span class="cm-variable">i</span> <span class="cm-keyword">in</span> <span class="cm-builtin">range</span>(<span class="cm-number">784</span>)))).<span class="cm-property">fetchone</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">figure</span>(<span class="cm-variable">figsize</span><span class="cm-operator">=</span>(<span class="cm-number">5</span>, <span class="cm-number">5</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">np</span>.<span class="cm-property">array</span>(<span class="cm-variable">avg_pixels</span>).<span class="cm-property">reshape</span>(<span class="cm-number">28</span>, <span class="cm-number">28</span>), <span class="cm-variable">cmap</span><span class="cm-operator">=</span><span class="cm-string">'hot'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">'Average pixel intensity (all digits)'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">colorbar</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">plt</span>.<span class="cm-property">show</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 251px;"></div><div class="CodeMirror-gutters" style="display: none; height: 251px;"></div></div></div></pre><p><span> </span><br/><img src="../01_data_loading_files/01_data_loading_11_0.png" alt="png">
<span> </span></p><p>&nbsp;</p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="python"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">con</span>.<span class="cm-property">close</span>()</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-builtin">print</span>(<span class="cm-string">'DuckDB connection closed. Database saved at:'</span>, <span class="cm-variable">db_path</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 50px;"></div><div class="CodeMirror-gutters" style="display: none; height: 50px;"></div></div></div></pre><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang=""><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 30.5391px; left: 28px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style="text-rendering: auto;"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">DuckDB connection closed. Database saved at: ..\data\mnist.duckdb</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 25px;"></div><div class="CodeMirror-gutters" style="display: none; height: 25px;"></div></div></div></pre><p>&nbsp;</p></div></div>
<script>(function(){function e(e,n,i){document.addEventListener(e,function(e){if(!e.defaultPrevented)for(var t=e.target;t&&t!=this;t=t.parentNode)if(t.matches(n)){!1===i.call(t,e)&&(e.preventDefault(),e.stopPropagation());break}},!1)}var t=document.body.parentElement,i=[],r=null,o=document.body.classList.contains("typora-export-collapse-outline");function a(){return t.scrollTop}e("click",".outline-expander",function(e){var t=this.closest(".outline-item-wrapper").classList;return t.contains("outline-item-open")?t.remove("outline-item-open"):t.add("outline-item-open"),u(),!1}),e("click",".outline-item",function(e){var t=this.querySelector(".outline-label");location.hash=t.getAttribute("href"),o&&((t=this.closest(".outline-item-wrapper").classList).contains("outline-item-open")||t.add("outline-item-open"),d(),t.add("outline-item-active"))});function s(){var e=a();r=null;for(var t=0;t<i.length&&i[t][1]-e<60;t++)r=i[t]}function n(){c=setTimeout(function(){var n;i=[],n=a(),document.querySelector("#write").querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(e=>{var t=e.getAttribute("id");i.push([t,n+e.getBoundingClientRect().y])}),s(),u()},300)}var l,c,d=function(){document.querySelectorAll(".outline-item-active").forEach(e=>e.classList.remove("outline-item-active")),document.querySelectorAll(".outline-item-single.outline-item-open").forEach(e=>e.classList.remove("outline-item-open"))},u=function(){if(r&&(d(),t=document.querySelector('.outline-label[href="#'+(CSS.escape?CSS.escape(r[0]):r[0])+'"]')))if(o){var e=t.closest(".outline-item-open>ul>.outline-item-wrapper");if(e)e.classList.add("outline-item-active");else{for(var t,n=(t=t.closest(".outline-item-wrapper")).parentElement.closest(".outline-item-wrapper");n;)n=(t=n).parentElement.closest(".outline-item-wrapper");t.classList.add("outline-item-active")}}else t.closest(".outline-item-wrapper").classList.add("outline-item-active")};window.addEventListener("scroll",function(e){l&&clearTimeout(l),l=setTimeout(function(){s(),u()},300)});window.addEventListener("resize",function(e){c&&clearTimeout(c),n()}),n()})();</script></body>
</html>