Skip to content
Snippets Groups Projects
load_vec.py 1.17 KiB
Newer Older
import numpy as np
from typing import Tuple
METADATA_SIZE = 6


def _parse_metadata(metadata: bytes) -> Tuple[type, int]:
    """
    Parse the metadata for a vec file.

    Parameters:
    metadata (bytes): The metadata bytes

    Returns:
    (type, int): The type and the number of component of the vector
    """

    little_endian = bool(metadata[0])
    endianness = 'little' if little_endian else 'big'

    size_of_components = int(metadata[1])
    # For now we only consider two types
    datatype = np.float64 if size_of_components == 8 else np.float

    # Recover our 32 bit integer specifying the endianness
    nb_components = int.from_bytes(metadata[2:], endianness)

    return datatype, nb_components


def load_vector(filename: str) -> np.ndarray:
    """
    Load a vector from a file.

    Parameters:
    filename (str): The name of the file containing the vector

    Returns:
    np.ndarray: The vector

    """
    file = open(filename, 'rb')
    # Read our metadata struct
    metadata = file.read(METADATA_SIZE)

    datatype, nb_components = _parse_metadata(metadata)

    array = np.fromfile(file, dtype=datatype, count=nb_components)

    file.close()
    return array