Disons que je crée 2 tableaux numpy, dont l'un est un tableau vide et l'autre de taille 1000x1000 composé de zéros :

import numpy as np;
A1 = np.array([])
A2 = np.zeros([1000,1000])

Lorsque je veux modifier une valeur dans A2, cela semble fonctionner correctement :

A2[n,m] = 17

Le code ci-dessus changerait la valeur de la position [n][m] dans A2 à 17.

Lorsque j'essaie ce qui précède avec A1, j'obtiens cette erreur :

A1[n,m] = 17

IndexError : l'index n est hors limites pour l'axe 0 avec la taille 0

Je sais pourquoi cela se produit, car il n'y a pas de position définie [n,m] dans A1 et cela a du sens, mais ma question est la suivante :

Existe-t-il un moyen de définir un tableau dynamique sans que cela mette à jour le tableau avec de nouvelles lignes et colonnes si A[n,m] = somevalue est entré lorsque n ou m ou les deux sont supérieurs à la limite d'un tableau A ?

Il n'a pas besoin d'être dans numpy, toute bibliothèque ou méthode pouvant mettre à jour la taille du tableau serait géniale. S'il s'agit d'une méthode, je peux imaginer qu'il existe une boucle if qui vérifie si [n][m] est hors limites et fait quelque chose à ce sujet.

Je viens d'un contexte MATLAB où il est facile de le faire. J'ai essayé de trouver quelque chose à ce sujet dans la documentation de numpy.array mais j'ai échoué.

ÉDITER: Je veux savoir si un moyen de créer une liste dynamique est possible en Python, pas seulement dans la bibliothèque numpy. Il ressort de cette question que cela ne fonctionne pas avec numpy Créer une dynamique tableau utilisant numpy en python.

1
Ariel A 20 févr. 2020 à 06:19

1 réponse

Meilleure réponse

Cela ne peut pas être fait dans numpy, et techniquement, cela ne peut pas non plus être fait dans MATLAB. Ce que MATLAB fait en coulisse, c'est de créer une nouvelle matrice entière, puis de copier toutes les données dans la nouvelle matrice, puis de supprimer l'ancienne matrice. Ce n'est pas de redimensionnement dynamique, ce qui n'est pas réellement possible en raison du fonctionnement des tableaux/matrices. C'est extrêmement lent, en particulier pour les grands tableaux, c'est pourquoi MATLAB vous avertit aujourd'hui de ne pas le faire.

Numpy, comme MATLAB, ne peut pas redimensionner les tableaux (en fait, contrairement à MATLAB, il le peut techniquement, mais seulement si vous avez de la chance, je vous déconseille donc d'essayer). Mais afin d'éviter le genre de confusion et de code lent que cela provoque dans MATLAB, numpy exige que vous créiez explicitement le nouveau tableau (en utilisant np.zeros) puis que vous copiez les données.

Python, contrairement à MATLAB, a en fait une structure de données vraiment redimensionnable : le list. Les listes nécessitent toujours qu'il y ait suffisamment d'éléments, car cela évite les erreurs d'indexation silencieuses difficiles à détecter dans MATLAB, mais vous pouvez redimensionner un tableau avec de très bonnes performances. Vous pouvez créer une liste n-dimensionnelle en utilisant des listes de listes imbriquées. Ensuite, une fois la liste terminée, vous pouvez la convertir en un tableau numpy.

2
TheBlackCat 3 mars 2020 à 21:22