.. _saving_and_loading: Saving and Loading Arrays ========================= .. currentmodule:: mlx.core MLX supports multiple array serialization formats. .. list-table:: Serialization Formats :widths: 20 8 25 25 :header-rows: 1 * - Format - Extension - Function - Notes * - NumPy - ``.npy`` - :func:`save` - Single arrays only * - NumPy archive - ``.npz`` - :func:`savez` and :func:`savez_compressed` - Multiple arrays * - Safetensors - ``.safetensors`` - :func:`save_safetensors` - Multiple arrays * - GGUF - ``.gguf`` - :func:`save_gguf` - Multiple arrays The :func:`load` function will load any of the supported serialization formats. It determines the format from the extensions. The output of :func:`load` depends on the format. Here's an example of saving a single array to a file: .. code-block:: shell >>> a = mx.array([1.0]) >>> mx.save("array", a) The array ``a`` will be saved in the file ``array.npy`` (notice the extension is automatically added). Including the extension is optional; if it is missing it will be added. You can load the array with: .. code-block:: shell >>> mx.load("array.npy") array([1], dtype=float32) Here's an example of saving several arrays to a single file: .. code-block:: shell >>> a = mx.array([1.0]) >>> b = mx.array([2.0]) >>> mx.savez("arrays", a, b=b) For compatibility with :func:`numpy.savez` the MLX :func:`savez` takes arrays as arguments. If the keywords are missing, then default names will be provided. This can be loaded with: .. code-block:: shell >>> mx.load("arrays.npz") {'b': array([2], dtype=float32), 'arr_0': array([1], dtype=float32)} In this case :func:`load` returns a dictionary of names to arrays. The functions :func:`save_safetensors` and :func:`save_gguf` are similar to :func:`savez`, but they take as input a :obj:`dict` of string names to arrays: .. code-block:: shell >>> a = mx.array([1.0]) >>> b = mx.array([2.0]) >>> mx.save_safetensors("arrays", {"a": a, "b": b})