[Python] Efficient Algorithems to find position of vector in 2D array

Discussão em 'Python' iniciado por Stack, Junho 8, 2025.

  1. Stack

    Stack Membro Participativo

    I have an interesting problem but cannot find the relevant literature, so need algorithem suggestions or just the correct way to phrase the problem so I can find the literature.

    I'm given a vector of varying length coming from a 2D array. I know the orientation (i.e. which axis I'm looking in). I need to find the start index of the vector.

    I have implemented a brute force approach but naturally it grows as O(n^2) where n is the dimension of the 2D array.

    Q1) What is an efficient algorithem to tackel this problem? Q2) How is this type of problem called (so I can find relevant papers)?

    There is measurement error but for now I just want to solve the general problem.

    Here the brute force approach:

    import time
    import numpy as np


    def get_distance(a: np.ndarray, b: np.ndarray) -> float:
    """ Calculate the distance between two vectors. """
    return np.linalg.norm(a - b)


    def find_min_distance_subvector(array: np.ndarray, x: np.ndarray) -> tuple[int, float]:
    leng = len(x)
    min_index = 0
    min_distance = np.inf

    # Assuming we know the orientation of the vector
    for ii in range(0, len(array) - leng):
    # Extract a sub-vector of the same length as x, starting from index ii
    sub_vec = array[ii:ii + leng]
    dist = get_distance(sub_vec, x)
    if dist < min_distance:
    min_distance = dist
    min_index = ii
    return min_index, min_distance


    def main():
    leng = 100
    size = 2000

    # Create the search map
    arr = np.random.random((size, size))

    # Pick a random sub-vector from the map
    index = np.random.randint(0, size - leng)
    x = arr[index:index + leng]

    start_time = time.time()
    min_index, min_metric = find_min_distance_subvector(arr, x)
    end_time = time.time()
    print(f"Minimum distance: {min_metric} at index {min_index}, correct index: {index}, "
    f"time taken: {end_time - start_time:.4f} seconds")


    if __name__ == '__main__':
    main()


    Thank you for your help

    Continue reading...

Compartilhe esta Página