{"id":6026,"date":"2026-10-14T18:02:04","date_gmt":"2026-10-14T18:02:04","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-ajouter-ligne-matrice-numpy-exemples\/"},"modified":"2026-10-14T18:02:04","modified_gmt":"2026-10-14T18:02:04","slug":"comment-ajouter-ligne-matrice-numpy-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-ajouter-ligne-matrice-numpy-exemples","title":{"rendered":"Comment ajouter une ligne \u00e0 une matrice dans NumPy (avec exemples)"},"content":{"rendered":"<p>Dans le domaine du calcul scientifique, de l&rsquo;apprentissage automatique et du traitement des donn\u00e9es massives en langage Python, la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\">NumPy<\/a> constitue l&rsquo;infrastructure fondamentale sur laquelle repose la quasi-totalit\u00e9 de l&rsquo;\u00e9cosyst\u00e8me num\u00e9rique contemporain. Qu&rsquo;il s&rsquo;agisse de manipuler des tenseurs au sein de r\u00e9seaux neuronaux profonds ou de mod\u00e9liser des syst\u00e8mes d&rsquo;\u00e9quations diff\u00e9rentielles stochastiques, l&rsquo;efficience algorithmique d\u00e9pend intrins\u00e8quement de la capacit\u00e9 du d\u00e9veloppeur et de l&rsquo;ing\u00e9nieur \u00e0 orchestrer des op\u00e9rations matricielles optimales. Parmi ces op\u00e9rations, l&rsquo;alt\u00e9ration de la topologie d&rsquo;une matrice bidimensionnelle, et plus particuli\u00e8rement l&rsquo;adjonction d&rsquo;une ligne suppl\u00e9mentaire \u00e0 une matrice pr\u00e9existante, repr\u00e9sente un cas d&rsquo;usage omnipr\u00e9sent dont l&rsquo;apparente simplicit\u00e9 masque une complexit\u00e9 architecturale substantielle au niveau de la gestion de la m\u00e9moire vive et de l&rsquo;ex\u00e9cution processeur.<\/p>\n<p>Contrairement aux conteneurs s\u00e9quentiels dynamiques conventionnels offerts nativement par les langages de programmation de haut niveau, les structures matricielles de NumPy ne sont pas con\u00e7ues pour subir des extensions incr\u00e9mentales \u00e9lastiques \u00e0 co\u00fbt constant. Chaque matrice, repr\u00e9sent\u00e9e sous la forme d&rsquo;un tableau multidimensionnel typ\u00e9, est assujettie \u00e0 des contraintes physiques d&rsquo;allocation m\u00e9moire contigu\u00eb directement h\u00e9rit\u00e9es de sa couche sous-jacente d\u00e9velopp\u00e9e en langage C. Par cons\u00e9quent, l&rsquo;op\u00e9ration consistant \u00e0 int\u00e9grer un vecteur horizontal additionnel au sein d&rsquo;une grille matricielle implique bien plus qu&rsquo;une simple r\u00e9affectation de pointeurs : elle engage des m\u00e9canismes d&rsquo;analyse dimensionnelle, de v\u00e9rification de compatibilit\u00e9 de types de donn\u00e9es, d&rsquo;allocation de nouveaux tampons d&rsquo;adressage et de copie int\u00e9grale de blocs binaires, avec des r\u00e9percussions critiques sur la complexit\u00e9 temporelle et spatiale du programme.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur les paradigmes, les m\u00e9thodologies et les fonctions canoniques permettant d&rsquo;ins\u00e9rer ou d&rsquo;agr\u00e9ger une ou plusieurs lignes \u00e0 une matrice dans l&rsquo;environnement NumPy. En explorant successivement les primitives de concat\u00e9nation verticale, les m\u00e9thodes d&rsquo;insertion positionnelle, le filtrage conditionnel vectoris\u00e9, ainsi que les r\u00e8gles formelles de diffusion dimensionnelle, nous mettrons en lumi\u00e8re les m\u00e9canismes internes qui r\u00e9gissent chaque technique. En outre, une \u00e9tude comparative de la complexit\u00e9 asymptotique permettra de quantifier les p\u00e9nalit\u00e9s de performance associ\u00e9es aux anti-patrons it\u00e9ratifs, tout en exposant les protocoles d&rsquo;ing\u00e9nierie logicielle recommand\u00e9s, tels que la pr\u00e9-allocation de m\u00e9moire et l&rsquo;agr\u00e9gation par lots, indispensables au traitement p\u00e9renne de volumineux jeux de donn\u00e9es.<\/p>\n<h2>1. Concepts fondamentaux des matrices multidimensionnelles dans NumPy<\/h2>\n<h3>1.1 Structure et repr\u00e9sentation des tableaux ndarray<\/h3>\n<p>L&rsquo;\u00e9l\u00e9ment pivot de la biblioth\u00e8que NumPy est l&rsquo;objet <em>ndarray<\/em> (pour <em>N-dimensional array<\/em>), une structure de donn\u00e9es g\u00e9n\u00e9rique con\u00e7ue pour stocker des \u00e9l\u00e9ments de mani\u00e8re homog\u00e8ne au sein d&rsquo;un bloc de m\u00e9moire contigu. Contrairement aux listes natives du langage Python, qui sont essentiellement des tableaux dynamiques de pointeurs pointant vers des objets Python h\u00e9t\u00e9rog\u00e8nes dispers\u00e9s dans la m\u00e9moire du tas (heap), le <em>ndarray<\/em> stocke directement les valeurs scalaires brutes dans un unique tampon m\u00e9moire non fragment\u00e9. Cette architecture permet d&rsquo;exploiter au maximum la localit\u00e9 spatiale et temporelle des donn\u00e9es, maximisant ainsi les taux de r\u00e9ussite des caches de donn\u00e9es de niveau 1, 2 et 3 (L1, L2, L3) int\u00e9gr\u00e9s aux processeurs modernes, tout en autorisant l&rsquo;ex\u00e9cution d&rsquo;instructions vectoris\u00e9es via les registres de calcul de type SIMD (Single Instruction, Multiple Data).<\/p>\n<p>Sur le plan conceptuel, il convient d&rsquo;\u00e9tablir une distinction rigoureuse entre un vecteur unidimensionnel et une matrice bidimensionnelle. Un vecteur unidimensionnel poss\u00e8de une signature morphologique comportant un seul axe, mat\u00e9rialis\u00e9e par un tuple de dimension \u00e0 un seul composant, tel que (N,). Dans cette configuration, les concepts de ligne et de colonne ne poss\u00e8dent aucune mat\u00e9rialit\u00e9 alg\u00e9brique ou informatique formelle ; le tableau n&rsquo;est qu&rsquo;une succession lin\u00e9aire d&rsquo;\u00e9l\u00e9ments. \u00c0 l&rsquo;inverse, une matrice est un tableau strictement bidimensionnel dont la morphologie est d\u00e9finie par un tuple \u00e0 deux composantes (M, N), o\u00f9 M explicite le nombre de lignes et N le nombre de colonnes. M\u00eame lorsqu&rsquo;une matrice ne comporte qu&rsquo;une unique rang\u00e9e, sa forme matricielle doit imp\u00e9rativement s&rsquo;\u00e9noncer sous la forme (1, N) pour \u00eatre consid\u00e9r\u00e9e comme une matrice ligne, soulignant ainsi la nature bidimensionnelle irr\u00e9ductible de l&rsquo;alg\u00e8bre matricielle.<\/p>\n<p>L&rsquo;interpr\u00e9tation et l&rsquo;indexation de ce bloc lin\u00e9aire de m\u00e9moire sont r\u00e9gies par trois attributs capitaux : <em>shape<\/em>, <em>ndim<\/em> et <em>strides<\/em>. L&rsquo;attribut <em>shape<\/em> est un tuple d&rsquo;entiers d\u00e9crivant la taille du tableau le long de chaque dimension orthogonale. L&rsquo;attribut <em>ndim<\/em> renvoie un entier unique indiquant le nombre total d&rsquo;axes g\u00e9om\u00e9triques, \u00e9quivalant pr\u00e9cis\u00e9ment \u00e0 la longueur du tuple de forme. Enfin, l&rsquo;attribut <em>strides<\/em> (ou foul\u00e9es) est un tuple d\u00e9finissant le nombre exact d&rsquo;octets que le pointeur de lecture doit franchir en m\u00e9moire vive pour passer d&rsquo;un \u00e9l\u00e9ment au suivant le long de chaque axe respectif. Par exemple, pour une matrice d&rsquo;entiers 64 bits (soit 8 octets par \u00e9l\u00e9ment) de dimensions (4, 3) organis\u00e9e selon l&rsquo;ordre standard du langage C (ordonnancement ligne par ligne ou <em>row-major order<\/em>), le pas sera caract\u00e9ris\u00e9 par le tuple (24, 8). Cela signifie qu&rsquo;une transition d&rsquo;une ligne \u00e0 la ligne imm\u00e9diatement inf\u00e9rieure n\u00e9cessite un saut de 24 octets (3 colonnes multipli\u00e9es par 8 octets), tandis que le d\u00e9placement d&rsquo;une colonne \u00e0 la suivante ne requiert qu&rsquo;un d\u00e9calage unitaire de 8 octets.<\/p>\n<h3>1.2 Principes directeurs de l&rsquo;alg\u00e8bre matricielle computationnelle<\/h3>\n<p>La manipulation matricielle dans NumPy repose sur l&rsquo;\u00e9tablissement d&rsquo;un syst\u00e8me de coordonn\u00e9es cart\u00e9siennes multidimensionnel o\u00f9 chaque axe est identifi\u00e9 par un indice entier ordinal. Dans le cadre d&rsquo;un tableau \u00e0 deux dimensions, l&rsquo;axe 0 (<em>axis 0<\/em>) d\u00e9signe invariablement l&rsquo;axe vertical, c&rsquo;est-\u00e0-dire la dimension qui progresse s\u00e9quentiellement le long des rang\u00e9es ou lignes de la matrice. L&rsquo;axe 1 (<em>axis 1<\/em>) repr\u00e9sente quant \u00e0 lui l&rsquo;axe horizontal, parcourant les colonnes adjacentes de gauche \u00e0 droite. Cette convention s\u00e9mantique est primordiale pour toute op\u00e9ration structurelle : appliquer une r\u00e9duction, une concat\u00e9nation ou une insertion le long de l&rsquo;axe 0 signifie que l&rsquo;action s&rsquo;ex\u00e9cute verticalement en affectant ou en agr\u00e9geant des lignes enti\u00e8res, modifiant ainsi la premi\u00e8re composante du tuple d\u00e9crivant la dimension globale.<\/p>\n<p>Une exigence architecturale non n\u00e9gociable de la classe <em>ndarray<\/em> r\u00e9side dans l&rsquo;homog\u00e9n\u00e9it\u00e9 stricte des types de donn\u00e9es scalaires sous-jacents, d\u00e9sign\u00e9s par le descripteur <em>dtype<\/em>. Contrairement aux structures polyvalentes de Python qui autorisent l&rsquo;entrelacement de cha\u00eenes de caract\u00e8res, d&rsquo;entiers arbitraires et de flottants au sein d&rsquo;une m\u00eame collection, chaque cellule d&rsquo;un tableau NumPy doit occuper un volume m\u00e9moire strictement identique et partager une m\u00e9thode d&rsquo;encodage binaire commune (comme <em>float64<\/em>, <em>int32<\/em>, ou <em>complex128<\/em>). Lorsqu&rsquo;une op\u00e9ration vise \u00e0 adjoindre une ligne \u00e0 une matrice, le type de donn\u00e9es de la ligne entrante doit imp\u00e9rativement s&rsquo;aligner sur celui de la matrice d&rsquo;accueil, sous peine de d\u00e9clencher des m\u00e9canismes d&rsquo;ajustement automatique de type qui peuvent alt\u00e9rer la pr\u00e9cision ou accro\u00eetre ind\u00fbment l&#8217;empreinte m\u00e9moire.<\/p>\n<p>Enfin, la distinction op\u00e9rationnelle entre une vue m\u00e9moire (<em>view<\/em>) et une copie physique (<em>copy<\/em>) gouverne l&rsquo;ensemble des transformations matricielles. Une vue est un nouvel objet d&rsquo;en-t\u00eate <em>ndarray<\/em> qui r\u00e9f\u00e9rence le m\u00eame tampon d&rsquo;octets sous-jacent qu&rsquo;un tableau pr\u00e9existant, mais avec des m\u00e9tadonn\u00e9es de forme ou de foul\u00e9es diff\u00e9rentes ; modifier les valeurs au travers d&rsquo;une vue impacte imm\u00e9diatement le tableau source, sans entra\u00eener de duplication de donn\u00e9es ni d&rsquo;allocation substantielle. En revanche, les alt\u00e9rations structurelles qui transforment la topologie globale d&rsquo;une matrice \u2014 telles que l&rsquo;ajout effectif d&rsquo;une ligne \u2014 ne peuvent physiquement pas \u00eatre r\u00e9solues par une simple vue en raison de la rupture de contigu\u00eft\u00e9 m\u00e9moire que cela engendrerait. De telles op\u00e9rations imposent in\u00e9vitablement la cr\u00e9ation d&rsquo;une copie physique distincte, exigeant l&rsquo;allocation d&rsquo;un nouvel espace m\u00e9moire tampon au sein du syst\u00e8me d&rsquo;exploitation.<\/p>\n<h2>2. L&rsquo;immuabilit\u00e9 architecturale des tableaux ndarray et ses implications<\/h2>\n<h3>2.1 Gestion de la m\u00e9moire contigu\u00eb en langage C sous-jacent<\/h3>\n<p>Pour appr\u00e9hender les contraintes techniques inh\u00e9rentes \u00e0 l&rsquo;ajout d&rsquo;une ligne, il est imp\u00e9ratif de comprendre comment NumPy g\u00e8re l&rsquo;allocation m\u00e9moire au niveau de son moteur impl\u00e9ment\u00e9 en langage C, notamment au travers de la structure <em>PyArrayObject<\/em>. Lorsqu&rsquo;un tableau est instanci\u00e9, le gestionnaire de m\u00e9moire de NumPy sollicite aupr\u00e8s du syst\u00e8me d&rsquo;exploitation l&rsquo;attribution d&rsquo;une plage d&rsquo;adresses contigu\u00ebs d&rsquo;une taille pr\u00e9cis\u00e9ment calibr\u00e9e pour accueillir le produit du nombre d&rsquo;\u00e9l\u00e9ments par la taille unitaire du type de donn\u00e9es. Cette allocation statique initiale garantit une vitesse d&rsquo;acc\u00e8s maximale en permettant le calcul arithm\u00e9tique direct de l&rsquo;adresse d&rsquo;un \u00e9l\u00e9ment via la formule associant l&rsquo;adresse de base du pointeur et les foul\u00e9es correspondantes aux indices sollicit\u00e9s.<\/p>\n<p>Cependant, cette contigu\u00eft\u00e9 stricte implique l&rsquo;impossibilit\u00e9 mat\u00e9rielle d&rsquo;\u00e9tendre dynamiquement un bloc de m\u00e9moire existant sans risquer d&#8217;empi\u00e9ter sur des segments de m\u00e9moire adjacents d\u00e9j\u00e0 assign\u00e9s \u00e0 d&rsquo;autres objets du processus d&rsquo;ex\u00e9cution. Dans un environnement de m\u00e9moire virtuelle, il est extr\u00eamement rare que l&rsquo;espace physique situ\u00e9 imm\u00e9diatement apr\u00e8s la fin du tampon d&rsquo;un tableau NumPy soit disponible pour une expansion lin\u00e9aire. En cons\u00e9quence, l&rsquo;adjonction d&rsquo;une rang\u00e9e suppl\u00e9mentaire ne peut pas s&rsquo;effectuer par une simple extension in situ. Le moteur C de NumPy est contraint d&rsquo;allouer un tout nouveau tampon m\u00e9moire d&rsquo;une capacit\u00e9 \u00e9gale \u00e0 la taille de la matrice initiale augment\u00e9e de la taille de la nouvelle ligne, puis de proc\u00e9der \u00e0 la copie int\u00e9grale bit \u00e0 bit des donn\u00e9es matricielles d&rsquo;origine et des nouvelles donn\u00e9es vers cette nouvelle zone m\u00e9moire, avant de lib\u00e9rer l&rsquo;ancien tampon.<\/p>\n<p>Ce m\u00e9canisme de r\u00e9allocation syst\u00e9matique exerce une pression directe et mesurable sur le ramasse-miettes (<em>garbage collector<\/em>) du runtime Python et sur le gestionnaire de m\u00e9moire du syst\u00e8me h\u00f4te. Chaque cr\u00e9ation de tableau matriciel interm\u00e9diaire engendre la g\u00e9n\u00e9ration d&rsquo;un bloc orphelin d\u00e8s lors que l&rsquo;ancienne variable est r\u00e9assign\u00e9e. Si cette op\u00e9ration est r\u00e9it\u00e9r\u00e9e au sein de boucles logiques it\u00e9ratives de grande dimension, elle induit une fragmentation s\u00e9v\u00e8re de la m\u00e9moire virtuelle, une sollicitation excessive des routines d&rsquo;allocation syst\u00e8me (telles que <em>malloc<\/em> et <em>free<\/em> en C), et d\u00e9clenche fr\u00e9quemment des cycles de r\u00e9cup\u00e9ration du ramasse-miettes qui interrompent momentan\u00e9ment l&rsquo;ex\u00e9cution des calculs, d\u00e9gradant dramatiquement la r\u00e9activit\u00e9 globale du syst\u00e8me applicatif.<\/p>\n<h3>2.2 Diff\u00e9rence fondamentale entre listes Python et tableaux NumPy<\/h3>\n<p>La confusion entre le comportement des listes standard en Python et celui des matrices NumPy est une source fr\u00e9quente d&rsquo;erreurs d&rsquo;optimisation chez les praticiens des sciences des donn\u00e9es. Les listes Python sont impl\u00e9ment\u00e9es en C sous la forme de tableaux dynamiques de pointeurs g\u00e9n\u00e9riques (<em>PyObject**<\/em>) appliquant une strat\u00e9gie agressive de surallocation (<em>over-allocation<\/em>). Lorsqu&rsquo;une liste Python voit sa capacit\u00e9 satur\u00e9e, le moteur d&rsquo;ex\u00e9cution r\u00e9alloue un espace substantiellement sup\u00e9rieur aux besoins imm\u00e9diats selon une progression g\u00e9om\u00e9trique d\u00e9finie. De ce fait, l&rsquo;adjonction d&rsquo;un \u00e9l\u00e9ment via la m\u00e9thode <em>append()<\/em> s&rsquo;effectue avec une complexit\u00e9 temporelle amortie en O(1), signifiant que la grande majorit\u00e9 des ajouts ne requiert aucune r\u00e9allocation physique de m\u00e9moire.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, les tableaux de la biblioth\u00e8que NumPy bannissent formellement tout principe de surallocation afin de pr\u00e9server une densit\u00e9 d&rsquo;information maximale et une compatibilit\u00e9 binaire sans surco\u00fbt avec les biblioth\u00e8ques d&rsquo;alg\u00e8bre lin\u00e9aire hautement optimis\u00e9es telles que <a rel=\"noopener noreferrer\" href=\"https:\/\/www.netlib.org\/lapack\/\">LAPACK<\/a> et <a rel=\"noopener noreferrer\" href=\"https:\/\/www.netlib.org\/blas\/\">BLAS<\/a>. Aucun octet exc\u00e9dentaire n&rsquo;est allou\u00e9 au-del\u00e0 de la forme g\u00e9om\u00e9trique d\u00e9clar\u00e9e par l&rsquo;attribut <em>shape<\/em>. Par cons\u00e9quent, l&rsquo;op\u00e9ration d&rsquo;adjonction dans NumPy ne b\u00e9n\u00e9ficie jamais d&rsquo;un co\u00fbt amorti constant : chaque ajout unitaire d&rsquo;une rang\u00e9e affiche un co\u00fbt algorithmique asymptotique proportionnel au volume total de donn\u00e9es d\u00e9j\u00e0 contenues dans la matrice h\u00f4te, soit une complexit\u00e9 temporelle d\u00e9terministe en O(N \u00d7 M).<\/p>\n<p>Cette divergence architecturale dicte une n\u00e9cessit\u00e9 m\u00e9thodologique absolue : il est imp\u00e9ratif d&rsquo;anticiper la topologie finale des structures de donn\u00e9es avant de lancer des calculs intensifs. Tenter de construire une matrice \u00e9l\u00e9ment par \u00e9l\u00e9ment, ligne apr\u00e8s ligne, au moyen d&rsquo;appels r\u00e9currents \u00e0 des fonctions de concat\u00e9nation constitue l&rsquo;un des anti-patrons les plus d\u00e9vastateurs en ing\u00e9nierie logicielle scientifique. L&rsquo;ing\u00e9nieur doit soit pr\u00e9d\u00e9finir une matrice r\u00e9ceptrice de dimensions maximales par pr\u00e9-allocation, soit exploiter l&rsquo;\u00e9lasticit\u00e9 native des conteneurs standards de Python pour la phase d&rsquo;accumulation brute, avant d&rsquo;op\u00e9rer une transmutation unique et d\u00e9finitive vers une structure matricielle NumPy.<\/p>\n<h2>3. La fonction np.vstack : Syntaxe fondamentale et premier exemple pratique<\/h2>\n<h3>3.1 M\u00e9canisme th\u00e9orique de l&#8217;empilement vertical<\/h3>\n<p>La fonction <em>np.vstack<\/em>, abr\u00e9viation conventionnelle de <em>vertical stack<\/em>, constitue l&rsquo;une des abstractions de plus haut niveau offertes par NumPy pour proc\u00e9der \u00e0 l&rsquo;adjonction d&rsquo;une ligne au sein d&rsquo;une matrice. Th\u00e9oriquement, l&#8217;empilement vertical est d\u00e9fini comme la concat\u00e9nation de multiples tableaux le long du premier axe g\u00e9om\u00e9trique, soit l&rsquo;axe 0, apr\u00e8s avoir garanti que l&rsquo;ensemble des arguments d&rsquo;entr\u00e9e poss\u00e8de un niveau de dimensionnalit\u00e9 minimal \u00e9gal \u00e0 deux. Cette fonction encapsule la complexit\u00e9 inh\u00e9rente aux r\u00e8gles d&rsquo;alignement dimensionnel en proc\u00e9dant en interne \u00e0 des v\u00e9rifications g\u00e9om\u00e9triques rigoureuses avant d&rsquo;instancier le tableau consolid\u00e9.<\/p>\n<p>L&rsquo;exigence fondamentale de l&#8217;empilement vertical repose sur la concordance absolue de la dimension horizontale des op\u00e9randes impliqu\u00e9s. Plus pr\u00e9cis\u00e9ment, pour qu&rsquo;une ligne puisse \u00eatre empil\u00e9e verticalement sous une matrice d&rsquo;accueil de dimensions (M, N), l&rsquo;op\u00e9rande candidat doit imp\u00e9rativement comporter un nombre d&rsquo;\u00e9l\u00e9ments strictement \u00e9quivalent \u00e0 N le long de son axe horizontal. Si la matrice initiale poss\u00e8de une largeur de quatre colonnes, toute tentative de lui adjoindre une rang\u00e9e comportant trois ou cinq scalaires entra\u00eenera l&rsquo;interruption brutale de l&rsquo;interpr\u00e9teur par le soul\u00e8vement d&rsquo;une exception dimensionnelle formelle, pr\u00e9venant ainsi toute corruption structurelle de la g\u00e9om\u00e9trie matricielle.<\/p>\n<p>Un atout ergonomique majeur de la fonction <em>np.vstack<\/em> r\u00e9side dans sa capacit\u00e9 \u00e0 op\u00e9rer une conversion implicite et souple des s\u00e9quences d&rsquo;entr\u00e9e qui ne respectent pas strictement le statut de tableau bidimensionnel. Lorsqu&rsquo;un vecteur unidimensionnel de morphologie (N,) lui est soumis conjointement \u00e0 une matrice de morphologie (M, N), la fonction assure une promotion dimensionnelle pr\u00e9alable en assimilant le vecteur \u00e0 un tableau matriciel virtuel de forme (1, N). Cette flexibilit\u00e9 syntaxique \u00e9vite \u00e0 l&rsquo;utilisateur d&rsquo;avoir \u00e0 formater explicitement chaque nouvelle ligne au moyen de transformations tensorielles fastidieuses, fluidifiant ainsi la r\u00e9daction du code tout en maintenant l&rsquo;int\u00e9grit\u00e9 de la m\u00e9moire sous-jacente.<\/p>\n<h3>3.2 Exemple 1 : Ajout simple d&rsquo;une ligne \u00e0 une matrice existante<\/h3>\n<p>Afin d&rsquo;illustrer concr\u00e8tement le d\u00e9ploiement de cette m\u00e9thode fondamentale, consid\u00e9rons l&rsquo;instanciation m\u00e9thodique d&rsquo;une matrice de r\u00e9f\u00e9rence compos\u00e9e de trois lignes et trois colonnes, h\u00e9bergeant une s\u00e9rie de valeurs s\u00e9quentielles enti\u00e8res, puis l&rsquo;op\u00e9ration d&rsquo;adjonction d&rsquo;une quatri\u00e8me rang\u00e9e d\u00e9finie \u00e0 partir d&rsquo;un vecteur horizontal compatible. Le protocole s&rsquo;articule autour de l&rsquo;initialisation des variables, de l&rsquo;invocation de la primitive d&#8217;empilement et de l&rsquo;inspection cons\u00e9cutive des m\u00e9tadonn\u00e9es structurelles.<\/p>\n<p>Dans un premier temps, nous initialisons la matrice h\u00f4te au moyen de l&rsquo;expression <em>matrice_base = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])<\/em>. Cette instruction alloue un bloc contigu de neuf entiers ordonn\u00e9s selon une forme bidimensionnelle (3, 3). Parall\u00e8lement, nous d\u00e9finissons la rang\u00e9e destin\u00e9e \u00e0 \u00eatre adjointe au bas de cette grille sous la forme d&rsquo;un vecteur unidimensionnel comportant trois composantes scalaires : <em>nouvelle_ligne = np.array([100, 110, 120])<\/em>. \u00c0 ce stade, la propri\u00e9t\u00e9 <em>nouvelle_ligne.shape<\/em> renvoie formellement le tuple (3,), confirmant son statut d&rsquo;objet unidimensionnel d\u00e9nu\u00e9 de composante matricielle verticale.<\/p>\n<p>L&rsquo;op\u00e9ration d&rsquo;adjonction s&rsquo;ex\u00e9cute en transmettant un tuple ou une liste contenant les deux entit\u00e9s \u00e0 la fonction d\u00e9di\u00e9e : <em>matrice_etendue = np.vstack((matrice_base, nouvelle_ligne))<\/em>. Lors de l&rsquo;\u00e9valuation de cette ligne de code, NumPy proc\u00e8de \u00e0 l&rsquo;allocation d&rsquo;une nouvelle plage m\u00e9moire capable d&rsquo;accueillir douze \u00e9l\u00e9ments au format entier. Les neuf scalaires de la matrice initiale y sont transf\u00e9r\u00e9s s\u00e9quentiellement, suivis imm\u00e9diatement des trois valeurs constitutives de la nouvelle rang\u00e9e. L&rsquo;inspection post-op\u00e9ratoire de la variable <em>matrice_etendue<\/em> confirme que la matrice r\u00e9sultante pr\u00e9sente d\u00e9sormais la signature dimensionnelle (4, 3), attestant que l&rsquo;adjonction de la ligne a \u00e9t\u00e9 op\u00e9r\u00e9e avec succ\u00e8s le long de l&rsquo;axe vertical sans alt\u00e9rer l&rsquo;int\u00e9grit\u00e9 des donn\u00e9es d&rsquo;origine.<\/p>\n<h3>3.3 Variantes syntaxiques et passage de structures h\u00e9t\u00e9rog\u00e8nes<\/h3>\n<p>La robustesse de la primitive <em>np.vstack<\/em> s&rsquo;exprime \u00e9galement \u00e0 travers sa capacit\u00e9 \u00e0 ing\u00e9rer directement des structures s\u00e9quentielles natives du langage Python, sans exiger leur instanciation pr\u00e9alable en tant qu&rsquo;objets de type <em>ndarray<\/em>. Il est parfaitement valide sur le plan syntaxique de transmettre une liste native d&rsquo;entiers en guise de seconde op\u00e9rande : <em>matrice_etendue = np.vstack((matrice_base, [100, 110, 120]))<\/em>. Dans cette conjoncture, le moteur C de NumPy intercepte la liste Python, en extrait les \u00e9l\u00e9ments scalaires, proc\u00e8de \u00e0 leur typage implicite conforme au contexte matriciel d&rsquo;accueil, et ex\u00e9cute l&#8217;empilement au sein du nouveau bloc de m\u00e9moire unifi\u00e9.<\/p>\n<p>Il importe toutefois de souligner l&rsquo;\u00e9quivalence op\u00e9rationnelle et les nuances subtiles existant entre l&rsquo;injection d&rsquo;un tableau purement unidimensionnel de dimensions (N,) et celle d&rsquo;un tableau d&rsquo;ores et d\u00e9j\u00e0 structur\u00e9 sous la forme d&rsquo;une matrice ligne bidimensionnelle de dimensions (1, N), tel que d\u00e9fini par <em>nouvelle_ligne_2d = np.array([[100, 110, 120]])<\/em>. Bien que <em>np.vstack<\/em> neutralise cette distinction par son m\u00e9canisme d&rsquo;\u00e9l\u00e9vation automatique de dimension, le passage d&rsquo;une structure d\u00e9j\u00e0 bidimensionnelle offre une garantie de d\u00e9terminisme accrue, notamment lors de l&rsquo;int\u00e9gration dans des cha\u00eenes de traitement automatis\u00e9es o\u00f9 les fonctions employ\u00e9es en aval imposent une dimensionnalit\u00e9 strictement invariable.<\/p>\n<p>Enfin, la question de la pr\u00e9servation ou de la mutation du type de donn\u00e9es (<em>dtype<\/em>) s&rsquo;av\u00e8re critique lors de l&rsquo;adjonction de structures h\u00e9t\u00e9rog\u00e8nes. Si la matrice initiale est typ\u00e9e sous le format d&rsquo;entiers \u00e0 32 bits (<em>int32<\/em>) et que la ligne soumise pour l&#8217;empilement contient ne serait-ce qu&rsquo;une unique valeur exprim\u00e9e sous forme de nombre \u00e0 virgule flottante (<em>float64<\/em>), l&rsquo;int\u00e9gralit\u00e9 du tableau nouvellement allou\u00e9 fera l&rsquo;objet d&rsquo;un m\u00e9canisme de transtypage ascendant implicite (<em>implicit upcasting<\/em>). L&rsquo;ensemble des entiers pr\u00e9existants sera irr\u00e9m\u00e9diablement converti en repr\u00e9sentations flottantes afin de garantir l&rsquo;homog\u00e9n\u00e9it\u00e9 du tampon r\u00e9sultant, ce qui doublera instantan\u00e9ment la volum\u00e9trie m\u00e9moire requise si le tableau initial \u00e9tait cod\u00e9 sur des entiers de faible largeur binaire.<\/p>\n<h2>4. La fonction np.concatenate : Contr\u00f4le explicite sur l&rsquo;axe vertical<\/h2>\n<h3>4.1 Param\u00e9trage formel de l&rsquo;axe z\u00e9ro<\/h3>\n<p>Si la fonction <em>np.vstack<\/em> fournit une interface conviviale pour les op\u00e9rations courantes, la fonction <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.concatenate.html\">numpy.concatenate<\/a> repr\u00e9sente l&rsquo;op\u00e9rateur canonique fondamental pour toute fusion de tableaux au sein de la biblioth\u00e8que. Contrairement aux fonctions d&#8217;empilement sp\u00e9cialis\u00e9es, <em>np.concatenate<\/em> requiert la sp\u00e9cification explicite de l&rsquo;axe directionnel le long duquel l&rsquo;assemblage doit \u00eatre conduit, via le param\u00e8tre nomm\u00e9 <em>axis<\/em>. Pour fusionner verticalement des structures matricielles, le param\u00e9trage formel impose l&rsquo;assignation <em>axis=0<\/em>, ce qui ordonne express\u00e9ment au moteur de calcul de concat\u00e9ner les blocs selon la premi\u00e8re dimension tensorielle.<\/p>\n<p>Cette approche canonique se distingue par une rigueur dimensionnelle sans compromis. Alors que <em>np.vstack<\/em> tol\u00e8re des \u00e9carts dimensionnels entre les op\u00e9randes en appliquant des r\u00e8gles d&rsquo;adaptation automatique, <em>np.concatenate<\/em> impose une conformit\u00e9 structurelle absolue : tous les tableaux candidats \u00e0 la fusion doivent imp\u00e9rativement poss\u00e9der un nombre d&rsquo;axes rigoureusement identique, d\u00e9fini par l&rsquo;attribut <em>ndim<\/em>. Par cons\u00e9quent, toute tentative de concat\u00e9ner directement une matrice bidimensionnelle de forme (M, N) avec un simple vecteur unidimensionnel de forme (N,) sous l&rsquo;instruction <em>np.concatenate((matrice, vecteur), axis=0)<\/em> l\u00e8vera une exception de dimensionnalit\u00e9, car le premier tableau \u00e9volue dans un espace \u00e0 deux dimensions tandis que le second n&rsquo;en poss\u00e8de qu&rsquo;une seule.<\/p>\n<p>Cette exigence dimensionnelle, bien que plus verbeuse, conf\u00e8re \u00e0 l&rsquo;ing\u00e9nieur logiciel une ma\u00eetrise totale sur la logique d&rsquo;ex\u00e9cution. Elle \u00e9limine les ambigu\u00eft\u00e9s d&rsquo;orientation qui peuvent survenir lorsque des structures de donn\u00e9es dynamiques sont manipul\u00e9es dans des pipelines de calcul scientifique complexes. En for\u00e7ant la d\u00e9claration explicite de l&rsquo;axe et la compatibilit\u00e9 structurelle des blocs m\u00e9moires, <em>np.concatenate<\/em> garantit que l&rsquo;op\u00e9ration ex\u00e9cut\u00e9e refl\u00e8te exactement l&rsquo;intention algorithmique du d\u00e9veloppeur, sans d\u00e9pendre de transformations heuristiques sous-jacentes.<\/p>\n<h3>4.2 Transformation dimensionnelle pr\u00e9alable de la ligne \u00e0 ajouter<\/h3>\n<p>\u00c9tant donn\u00e9 l&rsquo;intransigeance dimensionnelle de la fonction <em>np.concatenate<\/em>, il est obligatoire d&rsquo;op\u00e9rer une transformation pr\u00e9alable sur toute rang\u00e9e candidate stock\u00e9e sous une forme unidimensionnelle afin de promouvoir son rang tensoriel de un \u00e0 deux. La premi\u00e8re m\u00e9thode reconnue pour concr\u00e9tiser cette m\u00e9tamorphose fait intervenir l&rsquo;objet d&rsquo;indexation sp\u00e9cial <em>np.newaxis<\/em>. En ins\u00e9rant cette constante le long de la premi\u00e8re coordonn\u00e9e d&rsquo;acc\u00e8s, selon la formulation <em>ligne_2d = vecteur[np.newaxis, :]<\/em>, NumPy instancie imm\u00e9diatement une vue bidimensionnelle du vecteur initial, transformant la signature morphologique (N,) en une forme matricielle conforme (1, N).<\/p>\n<p>Une alternative tout aussi \u00e9l\u00e9gante consiste \u00e0 recourir \u00e0 la m\u00e9thode <em>reshape()<\/em> native de la classe <em>ndarray<\/em>, en formulant explicitement l&rsquo;expression <em>ligne_2d = vecteur.reshape(1, -1)<\/em>. Dans cette syntaxe, l&rsquo;entier 1 stipule express\u00e9ment la cr\u00e9ation d&rsquo;une dimension unique pour l&rsquo;axe vertical, tandis que la valeur n\u00e9gative -1 signale au compilateur NumPy de d\u00e9duire automatiquement la dimension r\u00e9siduelle de l&rsquo;axe horizontal en fonction du volume total d&rsquo;\u00e9l\u00e9ments scalaires pr\u00e9sents dans le tenseur d&rsquo;origine. Cette technique garantit une adaptabilit\u00e9 parfaite du code, quelle que soit la largeur effective de la matrice h\u00f4te.<\/p>\n<p>D\u00e8s lors que la transformation structurelle est op\u00e9r\u00e9e, l&rsquo;appel \u00e0 la fonction d&rsquo;adjonction s&rsquo;articule harmonieusement selon l&rsquo;instruction <em>matrice_finale = np.concatenate((matrice_principale, ligne_2d), axis=0)<\/em>. Cette syntaxe \u00e9limine toute ambigu\u00eft\u00e9 g\u00e9om\u00e9trique. Elle assure que la fusion s&rsquo;op\u00e8re entre deux entit\u00e9s appartenant strictement au m\u00eame espace morphologique matriciel, autorisant le gestionnaire bas niveau de NumPy \u00e0 cartographier directement les pointeurs m\u00e9moires et \u00e0 proc\u00e9der \u00e0 un transfert de blocs hautement performant sans aucune phase d&rsquo;ajustement interpr\u00e9tatif.<\/p>\n<h3>4.3 Concat\u00e9nation s\u00e9quentielle de multiples lignes simultan\u00e9es<\/h3>\n<p>L&rsquo;un des avantages fondamentaux de la m\u00e9thode <em>np.concatenate<\/em> r\u00e9side dans son aptitude native \u00e0 regrouper et fusionner simultan\u00e9ment un nombre arbitraire de rang\u00e9es en une unique passe op\u00e9rationnelle. Lorsqu&rsquo;un algorithme requiert l&rsquo;adjonction successive de plusieurs nouvelles lignes g\u00e9n\u00e9r\u00e9es ind\u00e9pendamment, proc\u00e9der par appels it\u00e9ratifs isol\u00e9s constitue un \u00e9cueil algorithmique majeur. \u00c0 l&rsquo;inverse, l&rsquo;ing\u00e9nieur peut regrouper l&rsquo;ensemble de ces nouvelles lignes au sein d&rsquo;une collection ordonn\u00e9e, telle qu&rsquo;un tuple ou une liste de tableaux bidimensionnels, pour ex\u00e9cuter une agglom\u00e9ration globale.<\/p>\n<p>Consid\u00e9rons la situation dans laquelle trois lignes matricielles distinctes, d\u00e9sign\u00e9es par <em>ligne_a<\/em>, <em>ligne_b<\/em> et <em>ligne_c<\/em>, toutes pr\u00e9alablement configur\u00e9es selon la morphologie (1, N), doivent \u00eatre rattach\u00e9es \u00e0 la matrice m\u00e8re. L&rsquo;instruction consolid\u00e9e s&rsquo;exprime sous la forme <em>matrice_etendue = np.concatenate((matrice_base, ligne_a, ligne_b, ligne_c), axis=0)<\/em>. Face \u00e0 cette instruction, le sous-syst\u00e8me de calcul \u00e9value la somme totale des hauteurs des composants matriciels, calcule pr\u00e9cis\u00e9ment l&rsquo;enveloppe d&rsquo;allocation globale requise pour contenir la matrice finale de dimensions (M + 3, N), et ex\u00e9cute une passe d&rsquo;allocation m\u00e9moire exclusive aupr\u00e8s du syst\u00e8me d&rsquo;exploitation h\u00f4te.<\/p>\n<p>Cette allocation en passe unique procure un avantage concurrentiel d\u00e9terminant en mati\u00e8re de performances computationnelles comparativement aux encha\u00eenements de concat\u00e9nations it\u00e9ratives. Non seulement le syst\u00e8me pr\u00e9vient la d\u00e9gradation de la m\u00e9moire par fragmentation, mais il minimise \u00e9galement le nombre total de copies physiques d&rsquo;\u00e9l\u00e9ments scalaires. Dans le cas d&rsquo;ajouts it\u00e9ratifs individuels, la matrice m\u00e8re est dupliqu\u00e9e \u00e0 chaque it\u00e9ration, g\u00e9n\u00e9rant un volume de copies quadratique, alors que le regroupement pr\u00e9alable permet d&rsquo;atteindre un co\u00fbt de transfert strictement lin\u00e9aire, born\u00e9 par la taille de la structure finale.<\/p>\n<h2>5. La m\u00e9thode np.append : M\u00e9canismes d&rsquo;adjonction et pi\u00e8ges d&rsquo;aplatissement<\/h2>\n<h3>5.1 Fonctionnement intrins\u00e8que de np.append<\/h3>\n<p>Par analogie s\u00e9mantique avec les environnements de d\u00e9veloppement conventionnels et les collections natives de Python, de nombreux d\u00e9veloppeurs se tournent instinctivement vers la fonction <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.append.html\">numpy.append<\/a> lorsqu&rsquo;ils ambitionnent d&rsquo;adjoindre une ligne \u00e0 une matrice. Toutefois, cette fonction masque des m\u00e9canismes internes particuliers dont l&rsquo;ignorance peut conduire \u00e0 des dysfonctionnements critiques dans la g\u00e9om\u00e9trie des donn\u00e9es calcul\u00e9es. La fonction <em>np.append<\/em> ne constitue pas une m\u00e9thode interne dynamique attach\u00e9e \u00e0 l&rsquo;objet, mais bien une fonction d&#8217;emballage (<em>wrapper<\/em>) qui d\u00e9l\u00e8gue en r\u00e9alit\u00e9 l&rsquo;int\u00e9gralit\u00e9 de son ex\u00e9cution \u00e0 la primitive <em>np.concatenate<\/em>.<\/p>\n<p>Le pi\u00e8ge fondamental r\u00e9side dans le traitement r\u00e9serv\u00e9 au param\u00e8tre optionnel <em>axis<\/em>. Dans la signature formelle de <em>np.append(arr, values, axis=None)<\/em>, la valeur par d\u00e9faut de l&rsquo;axe est configur\u00e9e sur <em>None<\/em>. Lorsque cette fonction est invoqu\u00e9e sans renseigner formellement la valeur de l&rsquo;axe, le comportement par d\u00e9faut de NumPy ne consiste pas \u00e0 deviner l&rsquo;axe d&#8217;empilement logique, mais \u00e0 ordonner l&rsquo;aplatissement (<em>flattening<\/em>) syst\u00e9matique et int\u00e9gral des deux op\u00e9randes d&rsquo;entr\u00e9e. Ainsi, l&rsquo;ex\u00e9cution d&rsquo;une instruction non param\u00e9tr\u00e9e telle que <em>resultat = np.append(matrice, nouvelle_ligne)<\/em> d\u00e9mant\u00e8le irr\u00e9m\u00e9diablement la structure bidimensionnelle de la matrice h\u00f4te et de la ligne cible, produisant en sortie un vecteur purement unidimensionnel contenant l&rsquo;ensemble des scalaires fusionn\u00e9s bout \u00e0 bout.<\/p>\n<p>Pour pr\u00e9server l&rsquo;int\u00e9grit\u00e9 bidimensionnelle et contraindre l&rsquo;op\u00e9ration \u00e0 agir dans le sens d&rsquo;un ajout vertical de rang\u00e9e, l&rsquo;explicitation du param\u00e8tre <em>axis=0<\/em> est strictement imp\u00e9rative. De surcro\u00eet, le flux d&rsquo;ex\u00e9cution interne de <em>np.append<\/em> impose que le second argument pr\u00e9sente une configuration spatiale strictement compatible avec le r\u00e9sultat escompt\u00e9, ce qui implique que les abstractions permissives souvent suppos\u00e9es par les d\u00e9butants n&rsquo;ont pas cours au niveau des couches compil\u00e9es de bas niveau.<\/p>\n<h3>5.2 Exemple m\u00e9thodique d&rsquo;adjonction via np.append<\/h3>\n<p>Pour mettre en \u0153uvre ad\u00e9quatement l&rsquo;adjonction d&rsquo;une ligne au moyen de la m\u00e9thode <em>np.append<\/em>, un protocole rigoureux de formatage des donn\u00e9es d&rsquo;entr\u00e9e s&rsquo;impose afin d&rsquo;\u00e9viter toute erreur de dimensions incompatibles ou tout aplatissement pr\u00e9judiciable. Soit une matrice bidimensionnelle de r\u00e9f\u00e9rence, contenant par exemple deux lignes et trois colonnes d&rsquo;\u00e9l\u00e9ments scalaires, caract\u00e9ris\u00e9e par une forme initiale (2, 3). Nous nous proposons de lui adjoindre une troisi\u00e8me rang\u00e9e comportant trois nouvelles valeurs num\u00e9riques.<\/p>\n<p>L&rsquo;op\u00e9ration exige que la nouvelle rang\u00e9e soit elle-m\u00eame encapsul\u00e9e au sein d&rsquo;une g\u00e9om\u00e9trie bidimensionnelle. Une formulation valide s&rsquo;\u00e9nonce selon la syntaxe : <em>matrice_maj = np.append(matrice_origine, np.array([[500, 600, 700]]), axis=0)<\/em>. Il est essentiel de noter la pr\u00e9sence des doubles crochets encadrant les \u00e9l\u00e9ments de la nouvelle ligne, mat\u00e9rialisant express\u00e9ment la nature de matrice ligne de forme (1, 3). \u00c0 la r\u00e9ception de ces param\u00e8tres, la fonction v\u00e9rifie que le nombre de colonnes co\u00efncide rigoureusement (trois de part et d&rsquo;autre), puis mandate <em>np.concatenate<\/em> le long de l&rsquo;axe 0 pour allouer un tampon contigu de six plus trois, soit neuf \u00e9l\u00e9ments, pr\u00e9sentant la dimension finale (3, 3).<\/p>\n<p>Bien que cette d\u00e9marche aboutisse au r\u00e9sultat g\u00e9om\u00e9trique d\u00e9sir\u00e9, une \u00e9valuation critique de l&rsquo;architecture logicielle conduit g\u00e9n\u00e9ralement \u00e0 d\u00e9conseiller l&rsquo;usage routinier de <em>np.append<\/em> dans du code de production optimis\u00e9. D&rsquo;une part, son nom entretient une fausse \u00e9quivalence mentale avec la m\u00e9thode <em>list.append()<\/em> de Python, incitant pernicieusement les d\u00e9veloppeurs \u00e0 l&rsquo;utiliser au sein de boucles it\u00e9ratives o\u00f9 elle d\u00e9ploie des performances calamiteuses. D&rsquo;autre part, son statut de surcouche superficielle n&rsquo;apporte aucune plus-value fonctionnelle par rapport \u00e0 un appel direct \u00e0 <em>np.concatenate<\/em> ou <em>np.vstack<\/em>, tout en introduisant un risque majeur d&rsquo;aplatissement silencieux en cas d&rsquo;omission accidentelle du param\u00e8tre d&rsquo;axe.<\/p>\n<h2>6. Insertion de lignes \u00e0 des indices sp\u00e9cifiques gr\u00e2ce \u00e0 np.insert<\/h2>\n<h3>6.1 Principes de positionnement arbitraire dans une matrice<\/h3>\n<p>Tandis que les fonctions abord\u00e9es jusqu&rsquo;\u00e0 pr\u00e9sent se cantonnent exclusivement \u00e0 l&rsquo;adjonction terminale de lignes au bas de la structure matricielle, des contextes d&rsquo;ing\u00e9nierie avanc\u00e9s imposent fr\u00e9quemment l&rsquo;incorporation de donn\u00e9es au sein d&#8217;emplacements topologiques arbitraires. La fonction <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.insert.html\">numpy.insert<\/a> r\u00e9pond sp\u00e9cifiquement \u00e0 cette exigence en offrant la capacit\u00e9 d&rsquo;intercaler une ou plusieurs rang\u00e9es \u00e0 n&rsquo;importe quel indice horizontal d\u00e9termin\u00e9 de la matrice r\u00e9ceptrice.<\/p>\n<p>La signature canonique de cette primitive s&rsquo;articule autour de quatre arguments structurants : le tableau d&rsquo;origine sur lequel l&rsquo;op\u00e9ration doit \u00eatre effectu\u00e9e, l&rsquo;indice num\u00e9rique (ou la s\u00e9quence d&rsquo;indices) marquant la position d&rsquo;intercalation, l&rsquo;objet contenant les valeurs \u00e0 ins\u00e9rer, et enfin l&rsquo;axe dimensionnel le long duquel l&rsquo;op\u00e9ration doit \u00eatre ex\u00e9cut\u00e9e. Contrairement aux m\u00e9canismes d&rsquo;adjonction en fin de matrice qui se contentent de juxtaposer des blocs m\u00e9moires, l&rsquo;insertion intercalaire introduit une complexit\u00e9 structurelle suppl\u00e9mentaire : elle n\u00e9cessite la scission conceptuelle du tableau d&rsquo;origine en deux segments disjoints, la translation physique des rang\u00e9es sous-jacentes vers des adresses m\u00e9moire plus distantes, et l&rsquo;intercalation du nouveau segment d&rsquo;octets au sein de l&rsquo;interstice ainsi cr\u00e9\u00e9.<\/p>\n<p>La gestion de l&rsquo;argument d&rsquo;axe demeure ici tout aussi capitale que pour les fonctions pr\u00e9c\u00e9dentes. L&rsquo;omission d\u00e9lib\u00e9r\u00e9e ou involontaire de la mention explicite <em>axis=0<\/em> entra\u00eenera, \u00e0 l&rsquo;instar de <em>np.append<\/em>, une transformation non d\u00e9sir\u00e9e en aplatissant le tableau multidimensionnel avant de proc\u00e9der \u00e0 l&rsquo;insertion scalaire, renvoyant un simple vecteur lin\u00e9aire. La d\u00e9claration rigoureuse de l&rsquo;axe vertical permet en revanche \u00e0 la fonction d&rsquo;ajuster les foul\u00e9es et les calculs d&rsquo;adresses pour reconstituer une g\u00e9om\u00e9trie matricielle bidimensionnelle int\u00e8gre.<\/p>\n<h3>6.2 Exemples d&rsquo;insertion au d\u00e9but et au milieu d&rsquo;une matrice<\/h3>\n<p>L&rsquo;insertion d&rsquo;une rang\u00e9e \u00e0 la position initiale d&rsquo;une matrice repr\u00e9sente un cas d&rsquo;application typique, notamment lors de l&rsquo;int\u00e9gration dynamique d&rsquo;un en-t\u00eate num\u00e9rique, d&rsquo;un point d&rsquo;origine d&rsquo;un rep\u00e8re g\u00e9om\u00e9trique ou de conditions limites initiales dans un mod\u00e8le de discr\u00e9tisation aux diff\u00e9rences finies. Soit une matrice de r\u00e9f\u00e9rence <em>A<\/em> de dimension (3, 3). Pour injecter une rang\u00e9e de z\u00e9ros au tout d\u00e9but de cette structure matricielle, l&rsquo;indice d&rsquo;intercalation doit \u00eatre fix\u00e9 \u00e0 la valeur 0 :<\/p>\n<p>L&rsquo;instruction s&rsquo;articule formellement sous la forme : <em>A_modifiee = np.insert(A, 0, [0, 0, 0], axis=0)<\/em>. Sous l&rsquo;effet de cet appel, NumPy instancie une nouvelle matrice de forme (4, 3), positionne les valeurs transmises sur la premi\u00e8re ligne d&rsquo;indice 0, puis copie l&rsquo;int\u00e9gralit\u00e9 des trois rang\u00e9es initiales de la matrice <em>A<\/em> en leur appliquant un d\u00e9calage d&rsquo;un cran vers les indices matriciels descendants 1, 2 et 3. Le type de donn\u00e9es de la matrice h\u00f4te est rigoureusement pr\u00e9serv\u00e9, pour peu que les scalaires ins\u00e9r\u00e9s s&rsquo;alignent avec le descripteur d&rsquo;origine.<\/p>\n<p>De mani\u00e8re similaire, l&rsquo;intercalation d&rsquo;une rang\u00e9e au c\u0153ur de la matrice s&rsquo;op\u00e8re en renseignant l&rsquo;indice m\u00e9dian d\u00e9sir\u00e9. Si l&rsquo;on ambitionne de positionner une nouvelle rang\u00e9e entre la deuxi\u00e8me et la troisi\u00e8me ligne de notre structure initiale de trois lignes, l&rsquo;indice cible sera configur\u00e9 sur la valeur 2 (en tenant compte de l&rsquo;indexation d\u00e9butant \u00e0 0) : <em>A_intercalee = np.insert(A, 2, [99, 99, 99], axis=0)<\/em>. Dans ce sch\u00e9ma, les lignes d&rsquo;indices 0 et 1 conservent leur emplacement relatif au sein de la nouvelle enveloppe m\u00e9moire, la nouvelle ligne occupe l&rsquo;indice 2, tandis que l&rsquo;ancienne troisi\u00e8me ligne d&rsquo;indice 2 est m\u00e9caniquement translat\u00e9e vers l&rsquo;indice 3.<\/p>\n<h3>6.3 Insertion simultan\u00e9e de lignes r\u00e9parties sur plusieurs indices<\/h3>\n<p>La puissance d&rsquo;abstraction de la primitive <em>np.insert<\/em> se manifeste avec \u00e9clat lorsqu&rsquo;il s&rsquo;agit d&rsquo;op\u00e9rer des insertions coordonn\u00e9es multiples au sein d&rsquo;une seule routine d&rsquo;ex\u00e9cution. Au lieu de soumettre un indice scalaire unique, l&rsquo;ing\u00e9nieur a la facult\u00e9 de sp\u00e9cifier une s\u00e9quence d&rsquo;indices r\u00e9cepteurs, ordonnant l&rsquo;injection synchronis\u00e9e de plusieurs rang\u00e9es le long de l&rsquo;axe vertical.<\/p>\n<p>Consid\u00e9rons l&rsquo;\u00e9ventualit\u00e9 o\u00f9 une m\u00eame ligne de d\u00e9marcation, constitu\u00e9e de valeurs identificateurs par exemple, doive \u00eatre ins\u00e9r\u00e9e simultan\u00e9ment avant la premi\u00e8re ligne (indice 0) et apr\u00e8s la deuxi\u00e8me ligne (indice 2). Si la valeur \u00e0 ins\u00e9rer est un tableau unidimensionnel unique, NumPy d\u00e9ploiera son m\u00e9canisme de diffusion automatique (<em>broadcasting<\/em>) pour reproduire fid\u00e8lement cette m\u00eame rang\u00e9e \u00e0 chacun des indices sp\u00e9cifi\u00e9s dans la s\u00e9quence : <em>A_multiple = np.insert(A, [0, 2], [1, 1, 1], axis=0)<\/em>. La matrice r\u00e9sultante comportera d\u00e8s lors deux rang\u00e9es additionnelles, ins\u00e9r\u00e9es aux positions prescrites, en une seule passe op\u00e9rationnelle.<\/p>\n<p>Dans un cas plus \u00e9labor\u00e9 o\u00f9 les lignes \u00e0 int\u00e9grer pr\u00e9sentent des donn\u00e9es scalaires h\u00e9t\u00e9rog\u00e8nes pour chaque position d&rsquo;insertion, il convient de transmettre une collection bidimensionnelle dont le nombre de lignes \u00e9quivaut rigoureusement au cardinal de la liste des indices cibles. Par exemple, l&rsquo;instruction <em>A_distribuee = np.insert(A, [1, 3], [[10, 20, 30], [40, 50, 60]], axis=0)<\/em> injectera le premier vecteur \u00e0 l&rsquo;indice 1 et le second \u00e0 l&rsquo;indice 3. Cette op\u00e9ration sophistiqu\u00e9e minimise les r\u00e9allocations syst\u00e8me en d\u00e9terminant a priori la forme matricielle finale et en calculant alg\u00e9briquement la destination de chaque segment de m\u00e9moire \u00e0 cloner.<\/p>\n<h2>7. Adjonction conditionnelle de lignes bas\u00e9e sur des pr\u00e9dicats bool\u00e9ens<\/h2>\n<h3>7.1 Fondements de l&rsquo;indexation bool\u00e9enne et masquage vectoris\u00e9<\/h3>\n<p>Dans les pipelines r\u00e9els d&rsquo;ing\u00e9nierie des donn\u00e9es et d&rsquo;apprentissage automatique, les lignes \u00e0 agr\u00e9ger au sein d&rsquo;une matrice ma\u00eetresse ne sont que rarement statiques ; elles d\u00e9pendent le plus souvent de crit\u00e8res analytiques complexes, de seuils statistiques ou de pr\u00e9dicats logiques calcul\u00e9s \u00e0 la vol\u00e9e. Plut\u00f4t que de recourir \u00e0 des branchements conditionnels s\u00e9quentiels via des instructions <em>if<\/em> imbriqu\u00e9es dans des boucles it\u00e9ratives Python \u2014 approche notoirement inefficace \u2014, l&rsquo;\u00e9cosyst\u00e8me NumPy propose le paradigme du masquage vectoris\u00e9 (<em>vectorized masking<\/em>).<\/p>\n<p>L&rsquo;indexation bool\u00e9enne repose sur l&rsquo;\u00e9valuation imm\u00e9diate d&rsquo;expressions relationnelles appliqu\u00e9es directement sur des vecteurs ou des matrices enti\u00e8res sans recours \u00e0 l&rsquo;interpr\u00e9teur de boucle standard. L&rsquo;application d&rsquo;un op\u00e9rateur de comparaison scalaire \u00e0 une colonne matricielle donn\u00e9e g\u00e9n\u00e8re instantan\u00e9ment un tableau d&rsquo;indicateurs logiques (un masque) compos\u00e9 exclusivement de valeurs bool\u00e9ennes \u00e9l\u00e9mentaires (<em>True<\/em> ou <em>False<\/em>), pr\u00e9sentant une forme isomorphe au nombre total de rang\u00e9es observ\u00e9es. Ce masque logique peut ensuite \u00eatre exploit\u00e9 comme s\u00e9lecteur d&rsquo;indexation pour filtrer en une unique instruction processeur les lignes qui satisfont rigoureusement au pr\u00e9dicat alg\u00e9brique.<\/p>\n<p>Cette m\u00e9thodologie tire parti de la vectorisation bas niveau offerte par les extensions vectorielles du mat\u00e9riel h\u00f4te. L&rsquo;extraction des rang\u00e9es candidates validant la condition s&rsquo;op\u00e8re \u00e0 des vitesses proches du d\u00e9bit maximal du bus m\u00e9moire, \u00e9liminant tout surco\u00fbt d&rsquo;interpr\u00e9tation dynamique. Les lignes ainsi filtr\u00e9es conservent leur organisation matricielle bidimensionnelle native et se trouvent imm\u00e9diatement pr\u00eates \u00e0 \u00eatre coupl\u00e9es avec la matrice d&rsquo;accumulation via les fonctions canoniques d&#8217;empilement vertical.<\/p>\n<h3>7.2 Exemple 2 : Filtrage logique pr\u00e9alable \u00e0 l&#8217;empilement vertical<\/h3>\n<p>Pour mat\u00e9rialiser ce protocole, concevons un cas d&rsquo;\u00e9tude m\u00e9thodique o\u00f9 nous disposons d&rsquo;une matrice principale de traitement et d&rsquo;un r\u00e9servoir matriciel de lignes candidates contenant diverses observations exp\u00e9rimentales. L&rsquo;objectif consiste \u00e0 n&rsquo;adjoindre \u00e0 la matrice principale que les seules rang\u00e9es candidates dont le premier param\u00e8tre exp\u00e9rimental (situ\u00e9 dans la premi\u00e8re colonne, d&rsquo;indice 0) v\u00e9rifie une contrainte d&rsquo;exclusion stricte, en l&rsquo;occurrence \u00eatre strictement inf\u00e9rieur au seuil num\u00e9rique 10.<\/p>\n<p>Dans un premier temps, nous instancions la matrice courante <em>matrice_principale<\/em> de dimension (2, 3), ainsi qu&rsquo;une matrice de candidats <em>lignes_candidates<\/em> de dimension (4, 3) h\u00e9bergeant un \u00e9chantillonnage h\u00e9t\u00e9rog\u00e8ne de mesures. Afin d&rsquo;isoler les rang\u00e9es conformes au crit\u00e8re, nous appliquons une expression relationnelle cibl\u00e9e sur l&rsquo;axe horizontal d&rsquo;indice z\u00e9ro : <em>masque = lignes_candidates[:, 0] &lt; 10<\/em>. Cette \u00e9valuation vectoris\u00e9e produit un vecteur bool\u00e9en unidimensionnel de longueur 4, associant la valeur <em>True<\/em> uniquement aux enregistrements respectant l&rsquo;in\u00e9galit\u00e9 stricte formul\u00e9e.<\/p>\n<p>L&rsquo;adjonction s\u00e9lective se d\u00e9ploie alors de mani\u00e8re hautement concise et \u00e9l\u00e9gante par la composition directe du masquage au sein de la fonction d&#8217;empilement : <em>matrice_consolidee = np.vstack((matrice_principale, lignes_candidates[masque]))<\/em>. Si, par exemple, deux des quatre rang\u00e9es candidates validaient la contrainte, l&rsquo;expression <em>lignes_candidates[masque]<\/em> isole instantan\u00e9ment un sous-ensemble matriciel de dimension (2, 3), que la fonction <em>np.vstack<\/em> fusionne avec la matrice initiale pour g\u00e9n\u00e9rer un r\u00e9sultat final de dimensions (4, 3). L&rsquo;int\u00e9grit\u00e9 matricielle est pr\u00e9serv\u00e9e sans qu&rsquo;aucune it\u00e9ration manuelle ni d\u00e9claration conditionnelle n&rsquo;ait \u00e9t\u00e9 ex\u00e9cut\u00e9e au niveau applicatif de haut niveau.<\/p>\n<h3>7.3 Combinaison de crit\u00e8res multiples et op\u00e9rateurs binaires<\/h3>\n<p>Les protocoles d&rsquo;adjonction conditionnelle n\u00e9cessitent fr\u00e9quemment la r\u00e9solution conjointe de plusieurs pr\u00e9dicats logiques orthogonaux. Pour conjuguer plusieurs conditions au sein de tableaux NumPy, l&rsquo;usage des op\u00e9rateurs logiques standards de Python (tels que <em>and<\/em> et <em>or<\/em>) est proscrit, car ceux-ci \u00e9valuent la v\u00e9rit\u00e9 globale d&rsquo;un conteneur en tant qu&rsquo;entit\u00e9 unique et non la v\u00e9rit\u00e9 \u00e9l\u00e9ment par \u00e9l\u00e9ment. Il est imp\u00e9ratif d&rsquo;utiliser les op\u00e9rateurs binaires vectoris\u00e9s : l&rsquo;esperluette <em>&amp;<\/em> pour la conjonction logique (ET) et la barre verticale <em>|<\/em> pour la disjonction logique (OU).<\/p>\n<p>La mise en \u0153uvre de ces op\u00e9rateurs impose une discipline syntaxique stricte concernant la parenth\u00e9tisation. En raison des r\u00e8gles de priorit\u00e9 des op\u00e9rateurs en langage Python, les comparateurs arithm\u00e9tiques poss\u00e8dent une pr\u00e9c\u00e9dence inf\u00e9rieure \u00e0 celle des op\u00e9rateurs binaires. Par cons\u00e9quent, chaque crit\u00e8re logique individuel doit obligatoirement \u00eatre encapsul\u00e9 au sein de parenth\u00e8ses d\u00e9di\u00e9es, sous peine de d\u00e9clencher des erreurs d&rsquo;interpr\u00e9tation syntaxique ou de faux r\u00e9sultats : <em>masque_complexe = (lignes_candidates[:, 0] &lt; 10) &amp; (lignes_candidates[:, 2] &gt; 50)<\/em>.<\/p>\n<p>Une complexit\u00e9 suppl\u00e9mentaire surgit lors du traitement de jeux de donn\u00e9es empiriques pollu\u00e9s par des valeurs manquantes ou non d\u00e9finies, classiquement mat\u00e9rialis\u00e9es par des scalaires <em>NaN<\/em> (pour <em>Not a Number<\/em>). Toute comparaison logique conventionnelle impliquant un <em>NaN<\/em> renvoie invariablement un r\u00e9sultat faux. Pour int\u00e9grer des crit\u00e8res relatifs \u00e0 l&rsquo;absence de valeurs au sein du filtre d&rsquo;adjonction, il est capital de mobiliser les fonctions logiques universelles d\u00e9di\u00e9es telles que <em>np.isnan()<\/em> ou son inverse logique <em>~np.isnan()<\/em>, garantissant que les lignes adjointes \u00e0 la matrice principale satisfont de mani\u00e8re exhaustive aux standards de propret\u00e9 statistique requis.<\/p>\n<h2>8. Alignement dimensionnel et r\u00e8gles de compatibilit\u00e9 structurelle<\/h2>\n<h3>8.1 R\u00e8gles strictes de diffusion (broadcasting) appliqu\u00e9es aux lignes<\/h3>\n<p>Le m\u00e9canisme de diffusion (<em>broadcasting<\/em>) repr\u00e9sente l&rsquo;un des piliers conceptuels les plus puissants de NumPy, permettant \u00e0 des op\u00e9rateurs d&rsquo;interagir sur des tableaux de dimensions divergentes sans duplication explicite de m\u00e9moire. Toutefois, lorsqu&rsquo;il est confront\u00e9 aux op\u00e9rations d&rsquo;adjonction structurelle le long d&rsquo;un axe d\u00e9termin\u00e9, le comportement du moteur de calcul est soumis \u00e0 des contraintes formelles rigoureuses qu&rsquo;il est indispensable de ma\u00eetriser pour \u00e9viter toute d\u00e9faillance structurelle.<\/p>\n<p>Selon les sp\u00e9cifications formelles de la <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/user\/basics.broadcasting.html\">diffusion dans NumPy<\/a>, deux dimensions sont jug\u00e9es compatibles d\u00e8s lors qu&rsquo;elles sont strictement \u00e9gales, ou que l&rsquo;une d&rsquo;entre elles poss\u00e8de une valeur unitaire \u00e9gale \u00e0 1. Lorsque l&rsquo;on proc\u00e8de \u00e0 une concat\u00e9nation le long de l&rsquo;axe vertical 0, les dimensions le long de tous les autres axes (en l&rsquo;occurrence l&rsquo;axe 1) doivent satisfaire \u00e0 cette compatibilit\u00e9. Un tableau unidimensionnel de dimensions (N,) ne poss\u00e8de aucun second axe ; lorsqu&rsquo;il est combin\u00e9 via des fonctions bas niveau sans ajustement contextuel, l&rsquo;absence de correspondance dimensionnelle formelle provoque un rejet syst\u00e9matique.<\/p>\n<p>La distinction structurelle entre un vecteur de signature (N,) et une matrice ligne de signature (1, N) prend ici tout son sens math\u00e9matique. Dans un vecteur de dimension (N,), la notion de direction orthogonale n&rsquo;existe pas : il s&rsquo;agit d&rsquo;un ensemble ordonn\u00e9 de N \u00e9l\u00e9ments le long d&rsquo;un axe unique. Dans une matrice ligne de dimension (1, N), l&rsquo;espace matriciel bidimensionnel est formellement \u00e9tabli, indiquant explicitement qu&rsquo;il s&rsquo;agit d&rsquo;une distribution horizontale compos\u00e9e d&rsquo;une unique ligne r\u00e9partie sur N colonnes. Cette conformit\u00e9 explicite est indispensable d\u00e8s lors que l&rsquo;on manipule des primitives de bas niveau d\u00e9pourvues de m\u00e9canismes d&rsquo;inf\u00e9rence heuristique.<\/p>\n<h3>8.2 Techniques de redimensionnement pr\u00e9ventif<\/h3>\n<p>Afin de pr\u00e9munir le code applicatif contre les exceptions d&rsquo;incompatibilit\u00e9 morphologique lors de l&rsquo;int\u00e9gration de flux de donn\u00e9es externes, l&rsquo;ing\u00e9nieur dispose de techniques avanc\u00e9es de standardisation dimensionnelle pr\u00e9ventive. La premi\u00e8re d&rsquo;entre elles fait appel \u00e0 la fonction haut niveau <em>np.atleast_2d()<\/em>. Cette primitive analyse chaque argument qui lui est soumis : si le tableau entrant pr\u00e9sente un statut unidimensionnel, elle en \u00e9l\u00e8ve automatiquement le rang tensoriel pour retourner une vue matricielle bidimensionnelle de dimensions (1, N), tout en laissant inchang\u00e9es les matrices poss\u00e9dant d\u00e9j\u00e0 deux dimensions ou plus.<\/p>\n<p>Dans les contextes r\u00e9ciproques o\u00f9 des dimensions superflues de taille unitaire viennent parasiter les structures matricielles (par exemple un tenseur de dimension (1, 1, N) r\u00e9sultant d&rsquo;une extraction en amont), l&rsquo;utilisation m\u00e9thodique de la fonction <em>np.squeeze()<\/em> permet de normaliser les structures en \u00e9liminant les axes redondants afin de ramener le tableau \u00e0 une forme canonique compatible avant toute tentative de concat\u00e9nation le long de l&rsquo;axe vertical.<\/p>\n<p>Enfin, dans tout environnement logiciel professionnel de haute criticit\u00e9, la fiabilisation des op\u00e9rations matricielles implique la mise en place d&rsquo;assertions logiques pr\u00e9alables v\u00e9rifiant l&rsquo;alignement strict du nombre de colonnes entre la matrice d&rsquo;accueil et les donn\u00e9es candidates. L&rsquo;impl\u00e9mentation d&rsquo;une condition d&rsquo;assertion d\u00e9fensive sous la syntaxe <em>assert matrice_hote.shape[1] == nouvelle_donnee.shape[-1], \u00ab\u00a0Incompatibilit\u00e9 critique du nombre de colonnes\u00a0\u00bb<\/em> constitue une barri\u00e8re de s\u00fbret\u00e9 logicielle indispensable qui intercepte les incoh\u00e9rences dimensionnelles avant qu&rsquo;elles ne soient r\u00e9percut\u00e9es dans les couches d&rsquo;allocation C sous-jacentes.<\/p>\n<h2>9. \u00c9tude comparative des performances et complexit\u00e9 algorithmique<\/h2>\n<h3>9.1 Analyse de la complexit\u00e9 asymptotique des r\u00e9allocations<\/h3>\n<p>L&rsquo;\u00e9valuation de l&rsquo;efficacit\u00e9 computationnelle des op\u00e9rations d&rsquo;adjonction de lignes dans NumPy requiert une formalisation rigoureuse de leur complexit\u00e9 asymptotique. Soit une matrice bidimensionnelle initiale comportant M lignes et N colonnes, et consid\u00e9rons le cas o\u00f9 un algorithme se propose d&rsquo;adjoindre s\u00e9quentiellement K lignes, une par une, au sein d&rsquo;une structure it\u00e9rative de type boucle <em>for<\/em>. \u00c0 chaque it\u00e9ration i (pour i variant de 1 \u00e0 K), l&rsquo;op\u00e9ration d&rsquo;adjonction requiert l&rsquo;allocation d&rsquo;un nouveau bloc m\u00e9moire dimensionn\u00e9 pour accueillir (M + i) \u00d7 N \u00e9l\u00e9ments scalaires, suivi du transfert physique int\u00e9gral des donn\u00e9es pr\u00e9existantes vers ce nouvel emplacement.<\/p>\n<p>Le volume cumul\u00e9 de copies scalaires ex\u00e9cut\u00e9es par l&rsquo;ensemble du processus it\u00e9ratif correspond \u00e0 la somme des tailles matricielles successives, ce qui se traduit math\u00e9matiquement par une s\u00e9rie arithm\u00e9tique dont la complexit\u00e9 temporelle globale s&rsquo;exprime par la relation en grand O :<\/p>\n<p>O(K \u00d7 M \u00d7 N + K\u00b2 \u00d7 N)<\/p>\n<p>Si la matrice initiale est substantielle ou si le nombre K de lignes \u00e0 ins\u00e9rer est \u00e9lev\u00e9, cette complexit\u00e9 quadratique entra\u00eene une d\u00e9gradation exponentielle des temps de traitement. Le syst\u00e8me processeur consacre l&rsquo;\u00e9crasante majorit\u00e9 de ses cycles d&rsquo;horloge non pas \u00e0 ex\u00e9cuter des calculs arithm\u00e9tiques utiles, mais \u00e0 saturer les bus de transfert m\u00e9moire (<em>memory bus bandwidth<\/em>) par la copie redondante et st\u00e9rile des m\u00eames segments d&rsquo;octets. De surcro\u00eet, cette charge incessante invalide de mani\u00e8re r\u00e9p\u00e9t\u00e9e les lignes de m\u00e9moire cache du processeur (<em>cache pollution<\/em>), an\u00e9antissant l&rsquo;un des avantages comp\u00e9titifs cardinaux de l&rsquo;environnement NumPy.<\/p>\n<h3>9.2 Benchmark quantitatif des fonctions d&#8217;empilement<\/h3>\n<p>Pour mesurer pr\u00e9cis\u00e9ment l&rsquo;impact pratique de ces contraintes d&rsquo;architecture, des micro-benchmarks quantitatifs r\u00e9v\u00e8lent des variations de latence mesurables entre les diff\u00e9rentes primitives logicielles d&rsquo;adjonction, m\u00eame lorsqu&rsquo;elles sont employ\u00e9es pour une op\u00e9ration unitaire d&#8217;empilement. Bien que les fonctions <em>np.vstack<\/em>, <em>np.concatenate<\/em> et <em>np.append<\/em> invoquent ultimement la m\u00eame sous-routine C d&rsquo;allocation et de copie, le co\u00fbt unitaire de leur surcharge d&rsquo;encapsulation (<em>call overhead<\/em>) varie sensiblement.<\/p>\n<p>En analysant les profils d&rsquo;ex\u00e9cution sur une matrice r\u00e9ceptrice standard de 10 000 lignes et 100 colonnes d&rsquo;\u00e9l\u00e9ments <em>float64<\/em>, l&rsquo;appel direct \u00e0 <em>np.concatenate((matrice, ligne), axis=0)<\/em> pr\u00e9sente syst\u00e9matiquement la latence la plus faible. En tant qu&rsquo;interface native directe vers la routine C <em>PyArray_Concatenate<\/em>, elle contourne les validations morphologiques interm\u00e9diaires. La fonction <em>np.vstack<\/em> accuse un surco\u00fbt temporel marginal de l&rsquo;ordre de 5 \u00e0 15 %, attribuable aux routines Python d&rsquo;adaptation automatique de dimension (comme l&rsquo;appel interne \u00e0 <em>atleast_2d<\/em>). En queue de peloton, <em>np.append<\/em> enregistre la latence d&rsquo;ex\u00e9cution la plus d\u00e9favorable en raison de l&rsquo;\u00e9valuation conditionnelle de son param\u00e8tre d&rsquo;axe par d\u00e9faut et de son double niveau d&rsquo;indirection.<\/p>\n<p>Cependant, la fonction qui subit la p\u00e9nalit\u00e9 de performance la plus s\u00e9v\u00e8re est indiscutablement <em>np.insert<\/em>. En raison de sa mission d&rsquo;insertion arbitraire, <em>np.insert<\/em> est astreinte \u00e0 analyser les indices, \u00e0 scinder logiquement les descripteurs de m\u00e9moire, \u00e0 v\u00e9rifier les d\u00e9passements de bornes et \u00e0 appliquer un calcul diff\u00e9rentiel sur les foul\u00e9es pour orchestrer la translation physique des blocs disjoints. Ce surco\u00fbt computationnel rend l&rsquo;usage de <em>np.insert<\/em> prohibitif au sein des boucles critiques, son d\u00e9ploiement devant \u00eatre strictement r\u00e9serv\u00e9 aux r\u00e9organisations topologiques sporadiques et non it\u00e9ratives.<\/p>\n<h2>10. Gestion de la m\u00e9moire vive et strat\u00e9gies d&rsquo;optimisation du tampon<\/h2>\n<h3>10.1 Approche par pr\u00e9-allocation matricielle<\/h3>\n<p>Face aux limites intrins\u00e8ques de l&rsquo;adjonction dynamique, la strat\u00e9gie d&rsquo;ing\u00e9nierie logicielle par excellence consiste \u00e0 \u00e9liminer totalement les r\u00e9allocations m\u00e9moire r\u00e9currentes en instanciant d\u00e8s l&rsquo;amont une matrice pr\u00e9-allou\u00e9e d&rsquo;une capacit\u00e9 suffisante pour absorber l&rsquo;ensemble des donn\u00e9es pr\u00e9visionnelles du calcul. Cette approche substitue un probl\u00e8me d&rsquo;adjonction structurelle co\u00fbteux par de simples op\u00e9rations d&rsquo;affectation par d\u00e9coupage (<em>slice assignment<\/em>) au sein d&rsquo;une m\u00e9moire statique pr\u00e9existante.<\/p>\n<p>Pour concr\u00e9tiser cette m\u00e9thodologie, l&rsquo;espace d&rsquo;accueil peut \u00eatre r\u00e9serv\u00e9 au moyen de la fonction <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.empty.html\">numpy.empty<\/a> ou <em>numpy.zeros<\/em>. L&rsquo;allocation via <em>np.empty((capacite_maximale, nombre_colonnes))<\/em> s&rsquo;av\u00e8re particuli\u00e8rement v\u00e9loce dans la mesure o\u00f9 elle se contente d&rsquo;allouer la plage d&rsquo;adresses virtuelles aupr\u00e8s du syst\u00e8me sans proc\u00e9der \u00e0 l&rsquo;initialisation bit \u00e0 bit des cellules m\u00e9moire, laissant les valeurs r\u00e9siduelles non modifi\u00e9es jusqu&rsquo;\u00e0 leur \u00e9criture effective. L&rsquo;\u00e9criture d&rsquo;une nouvelle ligne \u00e0 un emplacement d\u00e9termin\u00e9 s&rsquo;effectue ensuite par une commande d&rsquo;affectation directe : <em>matrice_preallouee[index_courant, :] = nouvelle_ligne<\/em>.<\/p>\n<p>Sur le plan de la complexit\u00e9 algorithmique, l&rsquo;affectation par d\u00e9coupage s&rsquo;op\u00e8re avec un co\u00fbt temporel strictement constant, soit O(1) par rapport \u00e0 la taille globale de la matrice d&rsquo;accueil, le processeur se contentant de calculer un d\u00e9calage de pointeur avant d&rsquo;ex\u00e9cuter l&rsquo;\u00e9criture en m\u00e9moire. Pour g\u00e9rer dynamiquement des flux de donn\u00e9es de taille inconnue a priori, il est classique d&rsquo;associer cette structure \u00e0 un pointeur d&rsquo;\u00e9criture logique simulant un tampon lin\u00e9aire ou un tampon circulaire (<em>ring buffer<\/em>). D\u00e8s que l&rsquo;espace arrive \u00e0 saturation, et dans ce cas seulement, une r\u00e9allocation g\u00e9om\u00e9trique globale doublant la taille du tampon peut \u00eatre op\u00e9r\u00e9e, restaurant ainsi une complexit\u00e9 temporelle amortie en O(1) identique \u00e0 celle des meilleures structures de conteneurs dynamiques.<\/p>\n<h3>10.2 Accumulation dans des structures dynamiques interm\u00e9diaires<\/h3>\n<p>Dans de nombreux cas d&rsquo;ing\u00e9nierie applicative, il s&rsquo;av\u00e8re impossible d&rsquo;estimer avec pr\u00e9cision la volum\u00e9trie finale des donn\u00e9es \u00e0 traiter, rendant la pr\u00e9-allocation matricielle directe difficile \u00e0 dimensionner sans risquer de provoquer une exception de d\u00e9passement de m\u00e9moire (<em>MemoryError<\/em>). Dans un tel contexte, la strat\u00e9gie optimale consiste \u00e0 exploiter de mani\u00e8re symbiotique les forces respectives des objets natifs de Python et la puissance de calcul de NumPy.<\/p>\n<p>Cette approche repose sur l&rsquo;utilisation d&rsquo;une simple liste native Python en guise de r\u00e9ceptacle d&rsquo;accumulation temporaire. Au cours de la phase it\u00e9rative de g\u00e9n\u00e9ration ou de r\u00e9ception des flux de donn\u00e9es, chaque nouvelle rang\u00e9e \u2014 qu&rsquo;elle soit sous forme de liste standard ou de tableau <em>ndarray<\/em> \u2014 est incorpor\u00e9e au conteneur au moyen de la m\u00e9thode native <em>liste_tampon.append(nouvelle_ligne)<\/em>. Comme explicit\u00e9 pr\u00e9c\u00e9demment, la liste Python g\u00e8re ses extensions par surallocation de m\u00e9moire au niveau de ses pointeurs C, absorbant ainsi les ajouts it\u00e9ratifs successifs \u00e0 co\u00fbt constant amorti sans provoquer la duplication r\u00e9p\u00e9t\u00e9e des donn\u00e9es num\u00e9riques brutes.<\/p>\n<p>Une fois le cycle d&rsquo;acquisition int\u00e9gralement parachev\u00e9, la liste tampon d&rsquo;accumulation est transmise en une passe exclusive \u00e0 la fonction de conversion unifi\u00e9e : <em>matrice_definitive = np.array(liste_tampon)<\/em> ou <em>matrice_definitive = np.vstack(liste_tampon)<\/em>. Cette d\u00e9marche concentre la totalit\u00e9 de la d\u00e9pense algorithmique en un \u00e9v\u00e9nement unique et ma\u00eetris\u00e9 : une seule allocation de m\u00e9moire contigu\u00eb calibr\u00e9e pr\u00e9cis\u00e9ment \u00e0 la taille exacte requise, suivie d&rsquo;un transfert s\u00e9quentiel lin\u00e9aire sans aucune fragmentation d&rsquo;adresses. Les gains en temps de calcul obtenus par ce patron architectural d\u00e9passent fr\u00e9quemment plusieurs ordres de grandeur par rapport \u00e0 une construction matricielle par concat\u00e9nations it\u00e9ratives.<\/p>\n<h2>11. Diagnostic et r\u00e9solution des erreurs de dimensionnalit\u00e9 fr\u00e9quentes<\/h2>\n<h3>11.1 R\u00e9solution de l&rsquo;exception ValueError: all the input array dimensions must match exactly<\/h3>\n<p>L&rsquo;une des d\u00e9convenues les plus r\u00e9currentes rencontr\u00e9es lors de la manipulation des op\u00e9rations de concat\u00e9nation sous NumPy r\u00e9side dans le d\u00e9clenchement brutal de l&rsquo;exception explicite : <em>ValueError: all the input array dimensions for the concatenation axis must match exactly<\/em>. Cette interruption d&rsquo;ex\u00e9cution se produit d\u00e8s lors que le moteur de bas niveau identifie une divergence irr\u00e9conciliable entre les caract\u00e9ristiques structurelles des matrices candidates le long des dimensions qui ne sont pas soumises \u00e0 la concat\u00e9nation.<\/p>\n<p>Pour illustrer la m\u00e9canique de cette anomalie, consid\u00e9rons une matrice matricielle h\u00f4te de dimensions (3, 4) \u2014 comprenant ainsi 3 lignes et 4 colonnes \u2014 \u00e0 laquelle un d\u00e9veloppeur tente d&rsquo;adjoindre une rang\u00e9e comportant par inadvertance 3 scalaires au lieu des 4 attendus, via l&rsquo;instruction <em>np.vstack((matrice, [1, 2, 3]))<\/em>. Lors de l&rsquo;\u00e9valuation de conformit\u00e9, NumPy analyse l&rsquo;axe 1 (l&rsquo;axe horizontal orthogonal \u00e0 l&rsquo;axe d&#8217;empilement 0) : il constate que le premier tableau exige une largeur de 4 unit\u00e9s, tandis que le second n&rsquo;en propose que 3. Ne pouvant tol\u00e9rer de matrice g\u00e9om\u00e9triquement irr\u00e9guli\u00e8re (les tableaux en escalier ou <em>jagged arrays<\/em> \u00e9tant formellement proscrits par l&rsquo;architecture <em>ndarray<\/em>), le sous-syst\u00e8me suspend imm\u00e9diatement l&rsquo;op\u00e9ration.<\/p>\n<p>Le protocole de diagnostic m\u00e9thodique implique l&rsquo;interrogation syst\u00e9matique de l&rsquo;attribut <em>shape<\/em> de chacun des \u00e9l\u00e9ments constitutifs avant de soumettre l&rsquo;instruction d&#8217;empilement :<\/p>\n<ul>\n<li>Inspecter la propri\u00e9t\u00e9 <em>matrice_hote.shape<\/em> pour identifier avec exactitude le nombre de colonnes impos\u00e9 par la structure r\u00e9ceptrice.<\/li>\n<li>Inspecter la signature de la nouvelle ligne candidate au moyen de <em>nouvelle_ligne.shape<\/em> ou d\u00e9terminer sa longueur via <em>len(nouvelle_ligne)<\/em> dans le cas d&rsquo;une collection native.<\/li>\n<li>Si la source \u00e9mettrice produit des s\u00e9ries temporelles ou des vecteurs de dimensions fluctuantes, impl\u00e9menter une \u00e9tape de validation pr\u00e9alable qui applique un rembourrage num\u00e9rique (<em>padding<\/em> via <em>np.pad<\/em>) ou une troncature rigoureusement contr\u00f4l\u00e9e afin de forcer l&rsquo;alignement g\u00e9om\u00e9trique sur la signature de la matrice m\u00e8re.<\/li>\n<\/ul>\n<h3>11.2 Gestion des incompatibilit\u00e9s de types de donn\u00e9es (dtypes)<\/h3>\n<p>Si la dimensionnalit\u00e9 morphologique constitue la premi\u00e8re condition d&rsquo;int\u00e9grit\u00e9 matricielle, la conformit\u00e9 des types scalaires sous-jacents (<em>dtype<\/em>) repr\u00e9sente la seconde contrainte majeure r\u00e9gissant la stabilit\u00e9 num\u00e9rique des programmes. L&rsquo;adjonction d&rsquo;une ligne dont le typage binaire diverge de celui de la matrice r\u00e9ceptrice active les protocoles de transtypage automatique ascendant de NumPy, avec des cons\u00e9quences parfois d\u00e9l\u00e9t\u00e8res sur la pr\u00e9cision num\u00e9rique ou l&#8217;empreinte m\u00e9moire du syst\u00e8me.<\/p>\n<p>Supposons qu&rsquo;une matrice ait \u00e9t\u00e9 initialis\u00e9e de mani\u00e8re optimis\u00e9e pour des calculs d&rsquo;imagerie sous la forme d&rsquo;un tableau d&rsquo;entiers non sign\u00e9s 8 bits via l&rsquo;argument <em>dtype=np.uint8<\/em>, permettant \u00e0 chaque pixel de n&rsquo;occuper qu&rsquo;un seul octet physique. Si l&rsquo;on adjoint \u00e0 cette matrice une rang\u00e9e contenant ne serait-ce qu&rsquo;une valeur d\u00e9cimale exprim\u00e9e par un flottant standard tel que 12.5, NumPy proc\u00e9dera imm\u00e9diatement \u00e0 la promotion g\u00e9n\u00e9rale de l&rsquo;ensemble de la structure matricielle finale vers le type de donn\u00e9es commun le plus repr\u00e9sentatif, \u00e0 savoir <em>float64<\/em>. L&#8217;empreinte m\u00e9moire vive occup\u00e9e par la matrice r\u00e9sultante se trouvera alors instantan\u00e9ment multipli\u00e9e par huit (passant de 1 octet \u00e0 8 octets par \u00e9l\u00e9ment), an\u00e9antissant les optimisations de m\u00e9moire pr\u00e9alablement \u00e9tablies.<\/p>\n<p>\u00c0 l&rsquo;inverse, si l&rsquo;on contraint explicitement le type de destination ou que l&rsquo;on proc\u00e8de \u00e0 une assignation par d\u00e9coupage dans une matrice pr\u00e9-allou\u00e9e d&rsquo;entiers sans ajustement de typage, les valeurs d\u00e9cimales de la ligne entrante subiront une troncature silencieuse de leur partie fractionnaire sans qu&rsquo;aucun avertissement ne soit \u00e9mis. Pour conjurer ces anomalies :<\/p>\n<ul>\n<li>D\u00e9clarer syst\u00e9matiquement le param\u00e8tre <em>dtype<\/em> lors de l&rsquo;instanciation des nouveaux vecteurs de donn\u00e9es en s&rsquo;alignant sur l&rsquo;attribut <em>matrice_hote.dtype<\/em>.<\/li>\n<li>Recourir \u00e0 la m\u00e9thode de conversion explicite <em>nouvelle_ligne.astype(matrice_hote.dtype, casting=&rsquo;safe&rsquo;)<\/em> qui a l&rsquo;avantage de lever une exception formelle d\u00e8s lors qu&rsquo;une op\u00e9ration de conversion implique une d\u00e9gradation ou une perte de donn\u00e9es critiques.<\/li>\n<\/ul>\n<h2>12. Protocoles de conception et alternatives vectoris\u00e9es pour les grands corpus de donn\u00e9es<\/h2>\n<h3>12.1 Transformation des flux de donn\u00e9es en architecture batch<\/h3>\n<p>Dans l&rsquo;ing\u00e9nierie des syst\u00e8mes de traitement massifs contemporains, tels que les flux d&rsquo;ingestion d&rsquo;\u00e9v\u00e9nements financiers haute fr\u00e9quence ou les r\u00e9seaux de capteurs de l&rsquo;Internet des Objets (IoT), les enregistrements se manifestent sous la forme d&rsquo;un flux continu d&rsquo;observations scalaires unitaires. Appliquer une logique synchrone consistant \u00e0 concat\u00e9ner chaque ligne \u00e0 une matrice centrale d\u00e8s sa r\u00e9ception au sein de l&rsquo;architecture logicielle constitue une d\u00e9faillance de conception critique garantissant la saturation rapide des capacit\u00e9s de traitement.<\/p>\n<p>Le paradigme d&rsquo;architecture par lots (<em>batch architecture<\/em>) apporte une r\u00e9ponse hautement optimis\u00e9e \u00e0 cette contrainte d&rsquo;\u00e9chelle. Cette approche consiste \u00e0 d\u00e9coupler l&rsquo;\u00e9tape d&rsquo;ingestion de l&rsquo;\u00e9tape de consolidation matricielle en introduisant un tampon de r\u00e9tention transitoire. Les flux unitaires entrants sont accumul\u00e9s dans une structure l\u00e9g\u00e8re \u00e0 faible latence d&rsquo;\u00e9criture jusqu&rsquo;\u00e0 atteindre un volume de seuil pr\u00e9d\u00e9fini, appel\u00e9 mini-lot (<em>mini-batch<\/em>), comprenant par exemple 5 000 ou 10 000 rang\u00e9es \u00e9l\u00e9mentaires.<\/p>\n<p>D\u00e8s que le quota du lot est combl\u00e9, les donn\u00e9es accumul\u00e9es sont unifi\u00e9es en une seule matrice interm\u00e9diaire, laquelle est alors consolid\u00e9e en une unique passe d&#8217;empilement vertical au sein du corpus matriciel historique. Ce mod\u00e8le procure un double avantage :<\/p>\n<ul>\n<li>Il r\u00e9duit de plusieurs ordres de grandeur le nombre absolu d&rsquo;appels aux routines d&rsquo;allocation du syst\u00e8me d&rsquo;exploitation h\u00f4te, concentrant les transferts m\u00e9moire dans des fen\u00eatres temporelles contr\u00f4l\u00e9es.<\/li>\n<li>Il permet d&rsquo;ex\u00e9cuter des traitements de nettoyage, de normalisation ou d&rsquo;inf\u00e9rence vectoris\u00e9s en exploitant pleinement la parall\u00e9lisation mat\u00e9rielle sur le bloc de donn\u00e9es agr\u00e9g\u00e9 via les biblioth\u00e8ques d&rsquo;alg\u00e8bre lin\u00e9aire sous-jacentes (OpenBLAS, Intel MKL), d\u00e9cuplant ainsi le rendement global du syst\u00e8me computationnel.<\/li>\n<\/ul>\n<h3>12.2 Synth\u00e8se comparative et tableau d&rsquo;aide \u00e0 la d\u00e9cision technique<\/h3>\n<p>Le choix de la m\u00e9thodologie appropri\u00e9e pour adjoindre une ou plusieurs lignes \u00e0 une matrice dans l&rsquo;\u00e9cosyst\u00e8me NumPy d\u00e9pend intrins\u00e8quement des contraintes de dimensionnalit\u00e9, des exigences de performance temporelle et des caract\u00e9ristiques d&rsquo;acc\u00e8s aux donn\u00e9es. Afin de guider l&rsquo;ing\u00e9nieur logiciel et le chercheur dans leurs arbitrages techniques, le comparatif analytique suivant synth\u00e9tise les propri\u00e9t\u00e9s architecturales fondamentales des approches \u00e9tudi\u00e9es au long de cet ouvrage technique :<\/p>\n<ul>\n<li><strong>Approche par np.vstack :<\/strong> Id\u00e9ale pour les op\u00e9rations d&rsquo;assemblage ponctuel et les scripts d&rsquo;analyse exploratoire n\u00e9cessitant une syntaxe concise. Elle tol\u00e8re l&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 structurelle relative (vecteur 1D fusionn\u00e9 avec matrice 2D), mais induit une l\u00e9g\u00e8re surcharge li\u00e9e aux validations morphologiques pr\u00e9alables. Complexit\u00e9 temporelle en O(N \u00d7 M).<\/li>\n<li><strong>Approche par np.concatenate (avec axis=0) :<\/strong> \u00c0 privil\u00e9gier imp\u00e9rativement pour le code de production et les modules logiciels critiques o\u00f9 la rigueur g\u00e9om\u00e9trique et la performance pure sont pr\u00e9pond\u00e9rantes. Exige un formatage pr\u00e9alable rigoureux des dimensions des op\u00e9randes, mais supprime tout surco\u00fbt d&rsquo;encapsulation. Complexit\u00e9 temporelle en O(N \u00d7 M).<\/li>\n<li><strong>Approche par np.append :<\/strong> G\u00e9n\u00e9ralement d\u00e9conseill\u00e9e dans les architectures logicielles p\u00e9rennes. Son comportement par d\u00e9faut sans sp\u00e9cification d&rsquo;axe engendre un aplatissement complet des donn\u00e9es, et sa syntaxe induit une confusion pernicieuse avec les listes natives sans offrir aucun gain computationnel par rapport \u00e0 <em>np.concatenate<\/em>.<\/li>\n<li><strong>Approche par np.insert :<\/strong> Destin\u00e9e exclusivement aux sc\u00e9narios impliquant des insertions intercalaires ou des positionnements arbitraires de rang\u00e9es en t\u00eate ou au c\u0153ur de la matrice. Son co\u00fbt de calcul est lourd en raison de la scission et de la translation physique des blocs d&rsquo;adresses m\u00e9moires. Complexit\u00e9 temporelle en O(N \u00d7 M).<\/li>\n<li><strong>Patron de conception par Pr\u00e9-allocation :<\/strong> Repr\u00e9sente le standard industriel absolu pour tous les algorithmes it\u00e9ratifs et le calcul haute performance. En r\u00e9servant initialement l&rsquo;espace m\u00e9moire total requis via <em>np.empty<\/em> ou <em>np.zeros<\/em>, chaque ligne est adjointe par simple affectation indicielle \u00e0 co\u00fbt temporel unitaire en O(1), maximisant le rendement des caches processeurs.<\/li>\n<li><strong>Patron d&rsquo;Accumulation en Liste dynamique :<\/strong> M\u00e9thodologie optimale lorsque la volum\u00e9trie terminale demeure impr\u00e9visible \u00e0 l&rsquo;entame du calcul. Elle exploite la croissance amortie de la m\u00e9moire des listes Python pour stocker les lignes g\u00e9n\u00e9r\u00e9es, avant d&rsquo;ex\u00e9cuter une transmutation finale exclusive et hautement efficace vers la matrice NumPy d\u00e9finitive.<\/li>\n<\/ul>\n<p>En d\u00e9finitive, la manipulation efficace de matrices au sein de NumPy requiert de s&rsquo;affranchir des r\u00e9flexes de programmation s\u00e9quentielle traditionnelle. Comprendre la mat\u00e9rialit\u00e9 physique des tampons contigus de m\u00e9moire C, appr\u00e9hender les implications de la r\u00e9allocation syst\u00e9matique, et choisir la primitive logicielle ad\u00e9quate en fonction du contexte dimensionnel constituent les comp\u00e9tences indispensables pour concevoir des architectures de calcul scientifique v\u00e9loces, robustes et hautement scalables.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R., Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del R\u00edo, F. U., Wiebe, M., Peterson, P., \u2026 Oliphant, T. E. (2020). Array programming with NumPy. <em>Nature<\/em>, 585(7825), 357\u2013362. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41586-020-2649-2\">https:\/\/doi.org\/10.1038\/s41586-020-2649-2<\/a><\/li>\n<li>NumPy Developers. (2023). <em>NumPy user guide (Release 1.26.0)<\/em>. NumPy documentation. <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/user\/\">https:\/\/numpy.org\/doc\/stable\/user\/<\/a><\/li>\n<li>NumPy Developers. (2023). <em>numpy.concatenate<\/em>. NumPy Reference documentation. <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.concatenate.html\">https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.concatenate.html<\/a><\/li>\n<li>NumPy Developers. (2023). <em>numpy.vstack<\/em>. NumPy Reference documentation. <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.vstack.html\">https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.vstack.html<\/a><\/li>\n<li>NumPy Developers. (2023). <em>numpy.insert<\/em>. NumPy Reference documentation. <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.insert.html\">https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.insert.html<\/a><\/li>\n<li>NumPy Developers. (2023). <em>numpy.append<\/em>. NumPy Reference documentation. <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.append.html\">https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.append.html<\/a><\/li>\n<li>Oliphant, T. E. (2006). <em>A guide to NumPy<\/em>. Trelgol Publishing.<\/li>\n<li>van der Walt, S., Colbert, S. C., &amp; Varoquaux, G. (2011). The NumPy array: A structure for efficient numerical computation. <em>Computing in Science &amp; Engineering<\/em>, 13(2), 22\u201330. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/MCSE.2011.37\">https:\/\/doi.org\/10.1109\/MCSE.2011.37<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet d\u00e9taillant les m\u00e9thodes pour ajouter une ligne \u00e0 une matrice NumPy : np.vstack, np.concatenate, ajouts conditionnels et performances.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[4882,2465],"tags":[4178,4110,7821,7820,2960],"class_list":["post-6026","psych_stat","type-psych_stat","status-publish","hentry","category-calcul-scientifique","category-programmation-python","tag-algebre-lineaire","tag-matrice","tag-np-concatenate","tag-np-vstack","tag-numpy"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/6026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6026"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/6026\/revisions"}],"predecessor-version":[{"id":16785,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/6026\/revisions\/16785"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}