<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mscneuro.neuro.uni-bremen.de/index.php?action=history&amp;feed=atom&amp;title=Converting_the_original_MNIST_files_into_numpy</id>
	<title>Converting the original MNIST files into numpy - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mscneuro.neuro.uni-bremen.de/index.php?action=history&amp;feed=atom&amp;title=Converting_the_original_MNIST_files_into_numpy"/>
	<link rel="alternate" type="text/html" href="https://mscneuro.neuro.uni-bremen.de/index.php?title=Converting_the_original_MNIST_files_into_numpy&amp;action=history"/>
	<updated>2026-09-30T04:54:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://mscneuro.neuro.uni-bremen.de/index.php?title=Converting_the_original_MNIST_files_into_numpy&amp;diff=470&amp;oldid=prev</id>
		<title>Davrot: Created page with &quot;Questions to [mailto:davrot@uni-bremen.de David Rotermund]  &#039;&#039;&#039;I will use Linux. You will need a replacement for gzip under Windows.&#039;&#039;&#039;  == Download the files == We need to download the MNIST database files  * t10k-images.idx3-ubyte.gz * t10k-labels.idx1-ubyte.gz * train-images.idx3-ubyte.gz * train-labels.idx1-ubyte.gz  A source for that is for example https://www.kaggle.com/datasets/hojjatk/mnist-dataset?resource=download  == Unpack the gz files == In a terminal:&lt;synta...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mscneuro.neuro.uni-bremen.de/index.php?title=Converting_the_original_MNIST_files_into_numpy&amp;diff=470&amp;oldid=prev"/>
		<updated>2025-10-21T09:47:28Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Questions to [mailto:davrot@uni-bremen.de David Rotermund]  &amp;#039;&amp;#039;&amp;#039;I will use Linux. You will need a replacement for gzip under Windows.&amp;#039;&amp;#039;&amp;#039;  == Download the files == We need to download the MNIST database files  * t10k-images.idx3-ubyte.gz * t10k-labels.idx1-ubyte.gz * train-images.idx3-ubyte.gz * train-labels.idx1-ubyte.gz  A source for that is for example https://www.kaggle.com/datasets/hojjatk/mnist-dataset?resource=download  == Unpack the gz files == In a terminal:&amp;lt;synta...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Questions to [mailto:davrot@uni-bremen.de David Rotermund]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;I will use Linux. You will need a replacement for gzip under Windows.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Download the files ==&lt;br /&gt;
We need to download the MNIST database files&lt;br /&gt;
&lt;br /&gt;
* t10k-images.idx3-ubyte.gz&lt;br /&gt;
* t10k-labels.idx1-ubyte.gz&lt;br /&gt;
* train-images.idx3-ubyte.gz&lt;br /&gt;
* train-labels.idx1-ubyte.gz&lt;br /&gt;
&lt;br /&gt;
A source for that is for example https://www.kaggle.com/datasets/hojjatk/mnist-dataset?resource=download&lt;br /&gt;
&lt;br /&gt;
== Unpack the gz files ==&lt;br /&gt;
In a terminal:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;gzip -d *.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Convert the data into numpy files ==&lt;br /&gt;
&lt;br /&gt;
=== [https://numpy.org/doc/stable/reference/generated/numpy.dtype.newbyteorder.html numpy.dtype.newbyteorder] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;type.newbyteorder(new_order=&amp;#039;S&amp;#039;, /)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;blockquote&amp;gt;Return a new dtype with a different byte order.&lt;br /&gt;
&lt;br /&gt;
Changes are also made in all fields and sub-arrays of the data type.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;new_order&amp;#039;&amp;#039;&amp;#039; : string, optional&lt;br /&gt;
&lt;br /&gt;
Byte order to force; a value from the byte order specifications below. The default value (‘S’) results in swapping the current byte order. new_order codes can be any of:&lt;br /&gt;
&lt;br /&gt;
‘S’ - swap dtype from current to opposite endian&lt;br /&gt;
&lt;br /&gt;
{‘&amp;amp;#x3C;’, ‘little’} - little endian&lt;br /&gt;
&lt;br /&gt;
{‘&amp;amp;#x3E;’, ‘big’} - big endian&lt;br /&gt;
&lt;br /&gt;
{‘=’, ‘native’} - native order&lt;br /&gt;
&lt;br /&gt;
{‘|’, ‘I’} - ignore (no change to byte order)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Label file structure ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[offset] [type] [value] [description]&lt;br /&gt;
&lt;br /&gt;
0000 32 bit integer 0x00000801(2049) magic number (MSB first)&lt;br /&gt;
&lt;br /&gt;
0004 32 bit integer 60000 number of items&lt;br /&gt;
&lt;br /&gt;
0008 unsigned byte ?? label&lt;br /&gt;
&lt;br /&gt;
0009 unsigned byte ?? label&lt;br /&gt;
&lt;br /&gt;
……..&lt;br /&gt;
&lt;br /&gt;
xxxx unsigned byte ?? label&amp;lt;/blockquote&amp;gt;The labels values are 0 to 9.&lt;br /&gt;
&lt;br /&gt;
=== Pattern file structure ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[offset] [type] [value] [description]&lt;br /&gt;
&lt;br /&gt;
0000 32 bit integer 0x00000803(2051) magic number&lt;br /&gt;
&lt;br /&gt;
0004 32 bit integer 60000 number of images&lt;br /&gt;
&lt;br /&gt;
0008 32 bit integer 28 number of rows&lt;br /&gt;
&lt;br /&gt;
0012 32 bit integer 28 number of columns&lt;br /&gt;
&lt;br /&gt;
0016 unsigned byte ?? pixel&lt;br /&gt;
&lt;br /&gt;
0017 unsigned byte ?? pixel&lt;br /&gt;
&lt;br /&gt;
……..&lt;br /&gt;
&lt;br /&gt;
xxxx unsigned byte ?? pixel&amp;lt;/blockquote&amp;gt;Pixels are organized row-wise.&lt;br /&gt;
&lt;br /&gt;
Pixel values are 0 to 255. 0 means background (white),&lt;br /&gt;
&lt;br /&gt;
255 means foreground (black).&lt;br /&gt;
&lt;br /&gt;
== Converting the dataset to numpy ==&lt;br /&gt;
My source code for that task: convert.py&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import numpy as np&lt;br /&gt;
&lt;br /&gt;
# [offset] [type]          [value]          [description]&lt;br /&gt;
# 0000     32 bit integer  0x00000801(2049) magic number (MSB first)&lt;br /&gt;
# 0004     32 bit integer  60000            number of items&lt;br /&gt;
# 0008     unsigned byte   ??               label&lt;br /&gt;
# 0009     unsigned byte   ??               label&lt;br /&gt;
# ........&lt;br /&gt;
# xxxx     unsigned byte   ??               label&lt;br /&gt;
# The labels values are 0 to 9.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ReadLabel:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Class for reading the labels from an MNIST label file&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, filename: str) -&amp;gt; None:&lt;br /&gt;
        self.filename: str = filename&lt;br /&gt;
        self.data = self.read_from_file(filename)&lt;br /&gt;
&lt;br /&gt;
    def read_from_file(self, filename: str) -&amp;gt; np.ndarray:&lt;br /&gt;
&lt;br /&gt;
        int_32bit_data = np.dtype(np.uint32)&lt;br /&gt;
        int_32bit_data = int_32bit_data.newbyteorder(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        with open(filename, &amp;quot;rb&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
            magic_flag: np.uint32 = np.frombuffer(file.read(4), int_32bit_data)[0]&lt;br /&gt;
&lt;br /&gt;
            if magic_flag != 2049:&lt;br /&gt;
                data: np.ndarray = np.zeros(0)&lt;br /&gt;
                number_of_elements: int = 0&lt;br /&gt;
            else:&lt;br /&gt;
                number_of_elements = np.frombuffer(file.read(4), int_32bit_data)[0]&lt;br /&gt;
&lt;br /&gt;
            if number_of_elements &amp;lt; 1:&lt;br /&gt;
                data = np.zeros(0)&lt;br /&gt;
            else:&lt;br /&gt;
                data = np.frombuffer(file.read(number_of_elements), dtype=np.uint8)&lt;br /&gt;
&lt;br /&gt;
        return data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# [offset] [type]          [value]          [description]&lt;br /&gt;
# 0000     32 bit integer  0x00000803(2051) magic number&lt;br /&gt;
# 0004     32 bit integer  60000            number of images&lt;br /&gt;
# 0008     32 bit integer  28               number of rows&lt;br /&gt;
# 0012     32 bit integer  28               number of columns&lt;br /&gt;
# 0016     unsigned byte   ??               pixel&lt;br /&gt;
# 0017     unsigned byte   ??               pixel&lt;br /&gt;
# ........&lt;br /&gt;
# xxxx     unsigned byte   ??               pixel&lt;br /&gt;
# Pixels are organized row-wise.&lt;br /&gt;
# Pixel values are 0 to 255. 0 means background (white),&lt;br /&gt;
# 255 means foreground (black).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ReadPicture:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Class for reading the images from an MNIST image file&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, filename: str) -&amp;gt; None:&lt;br /&gt;
        self.filename: str = filename&lt;br /&gt;
        self.Data = self.read_from_file(filename)&lt;br /&gt;
&lt;br /&gt;
    def read_from_file(self, filename: str) -&amp;gt; np.ndarray:&lt;br /&gt;
&lt;br /&gt;
        int_32bit_data = np.dtype(np.uint32)&lt;br /&gt;
        int_32bit_data = int_32bit_data.newbyteorder(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        with open(filename, &amp;quot;rb&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
            magic_flag = np.frombuffer(file.read(4), int_32bit_data)[0]&lt;br /&gt;
&lt;br /&gt;
            if magic_flag != 2051:&lt;br /&gt;
                data = np.zeros(0)&lt;br /&gt;
                number_of_elements: int = 0&lt;br /&gt;
            else:&lt;br /&gt;
                number_of_elements = np.frombuffer(file.read(4), int_32bit_data)[0]&lt;br /&gt;
&lt;br /&gt;
            if number_of_elements &amp;lt; 1:&lt;br /&gt;
                data = np.zeros(0)&lt;br /&gt;
                number_of_rows: int = 0&lt;br /&gt;
            else:&lt;br /&gt;
                number_of_rows = np.frombuffer(file.read(4), int_32bit_data)[0]&lt;br /&gt;
&lt;br /&gt;
            if number_of_rows != 28:&lt;br /&gt;
                data = np.zeros(0)&lt;br /&gt;
                number_of_columns: int = 0&lt;br /&gt;
            else:&lt;br /&gt;
                number_of_columns = np.frombuffer(file.read(4), int_32bit_data)[0]&lt;br /&gt;
&lt;br /&gt;
            if number_of_columns != 28:&lt;br /&gt;
                data = np.zeros(0)&lt;br /&gt;
            else:&lt;br /&gt;
                data = np.frombuffer(&lt;br /&gt;
                    file.read(number_of_elements * number_of_rows * number_of_columns),&lt;br /&gt;
                    dtype=np.uint8,&lt;br /&gt;
                )&lt;br /&gt;
                data = data.reshape(&lt;br /&gt;
                    number_of_elements, number_of_columns, number_of_rows&lt;br /&gt;
                )&lt;br /&gt;
&lt;br /&gt;
        return data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def proprocess_dataset(testdata_mode: bool) -&amp;gt; None:&lt;br /&gt;
&lt;br /&gt;
    if testdata_mode is True:&lt;br /&gt;
        filename_out_pattern: str = &amp;quot;test_pattern_storage.npy&amp;quot;&lt;br /&gt;
        filename_out_label: str = &amp;quot;test_label_storage.npy&amp;quot;&lt;br /&gt;
        filename_in_image: str = &amp;quot;t10k-images.idx3-ubyte&amp;quot;&lt;br /&gt;
        filename_in_label: str = &amp;quot;t10k-labels.idx1-ubyte&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        filename_out_pattern = &amp;quot;train_pattern_storage.npy&amp;quot;&lt;br /&gt;
        filename_out_label = &amp;quot;train_label_storage.npy&amp;quot;&lt;br /&gt;
        filename_in_image = &amp;quot;train-images.idx3-ubyte&amp;quot;&lt;br /&gt;
        filename_in_label = &amp;quot;train-labels.idx1-ubyte&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    pictures = ReadPicture(filename_in_image)&lt;br /&gt;
    labels = ReadLabel(filename_in_label)&lt;br /&gt;
&lt;br /&gt;
    # Down to 0 ... 1.0&lt;br /&gt;
    max_value = np.max(pictures.Data.astype(np.float32))&lt;br /&gt;
    pattern_storage = np.float32(pictures.Data.astype(np.float32) / max_value).astype(&lt;br /&gt;
        np.float32&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    label_storage = np.uint64(labels.data)&lt;br /&gt;
&lt;br /&gt;
    np.save(filename_out_pattern, pattern_storage)&lt;br /&gt;
    np.save(filename_out_label, label_storage)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
proprocess_dataset(testdata_mode=True)&lt;br /&gt;
proprocess_dataset(testdata_mode=False)&amp;lt;/syntaxhighlight&amp;gt;Now we have the files:&lt;br /&gt;
&lt;br /&gt;
* test_label_storage.npy&lt;br /&gt;
* test_pattern_storage.npy&lt;br /&gt;
* train_label_storage.npy&lt;br /&gt;
* train_pattern_storage.npy&lt;/div&gt;</summary>
		<author><name>Davrot</name></author>
	</entry>
</feed>