Répondre

1

Je ne suis pas sûr de savoir à quelle théorie vous faites référence, sous le capot ces méthodes sont juste une manipulation de tableau intelligente (spoiler: numpy manipulation de tableau).

  • La première, extract_patches_2d, est un simple wrapper 2-D sur extract_patches, qui appelle

    extract_patches(image, 
           patch_shape=(p_h, p_w, n_colors), 
           extraction_step=1) 
    

    et remodèle le résultat (source code).

  • Le second, extract_patches, est également un wrapper, cette fois ci numpy.as_strided. Il ne prépare que 2*n forme et à grands pas de déléguer le travail à

    as_strided(arr, shape=shape, strides=strides) 
    

    Voici son source code.

  • Ce qui est vraiment intéressant est numpy.as_strided. De sa documentation:

    as_strided crée une vue dans le tableau, compte tenu des progrès exactes et forme. Cela signifie qu'il manipule la structure de données interne de ndarray et, si fait incorrectement, les éléments de tableau peuvent pointer vers mémoire non valide et peuvent corrompre les résultats ou planter votre programme. Il est conseillé de toujours utiliser l'original x.strides lors du calcul des nouvelles avancées pour éviter de se fier à une disposition de mémoire contiguë.

    Ainsi, fondamentalement, le résultat est l'enveloppe par rapport au même tableau dans la mémoire (une vue ), qui fournit recherche d'index et chaque indice est à la recherche dans une région particulière à l'intérieur x. numpy.ndarray.view est la fonction numpy de base qui permet de visualiser à l'intérieur d'un tableau existant sans réallocation de mémoire. Si vous souhaitez plonger dans la façon dont la manipulation et les vues de tableaux sont numpy, numpy internals est un bon point de départ.