Comment puis-je vérifier si un tableau numpy est vide ou non ?
J'ai utilisé le code suivant, mais cela échoue si le tableau contient un zéro.
if not self.Definition.all():
Est-ce la solution ?
if self.Definition == array([]):
Comment puis-je vérifier si un tableau numpy est vide ou non ?
J'ai utilisé le code suivant, mais cela échoue si le tableau contient un zéro.
if not self.Definition.all():
Est-ce la solution ?
if self.Definition == array([]):
Vous pouvez toujours jeter un coup d'œil à la .size
attribut. Il s'agit défini comme un nombre entier et est égal à zéro ( 0
) lorsqu'il n'y a aucun élément dans le tableau :
import numpy as np
a = np.array([])
if a.size == 0:
# Do something when `a` is empty
C'est très bien pour numpy, mais il est regrettable que cela soit considéré comme non pythique pour les listes. Consultez la discussion sur les listes : stackoverflow.com/questions/53513/ Il serait bien d'utiliser le même modèle pour les tableaux et les listes numpy.
Le code NumPy en général ne fonctionne pas correctement sur les listes, ou vice-versa. Vous devez écrire du code d'une manière différente si vous utilisez des listes ou des tableaux NumPy.
https://numpy.org/devdocs/user/quickstart.html (2020.04.08)
L'objet principal de NumPy est le tableau multidimensionnel homogène. C'est un tableau d'éléments (généralement des nombres), tous du même type, indexés par un tuple d'entiers non négatifs. En NumPy, les dimensions sont appelées axes. (...) La classe de tableau de NumPy est appelée ndarray. (...) Les attributs les plus importants d'un objet ndarray sont :
ndarray.ndim
le nombre d'axes (dimensions) du tableau.ndarray.shape
les dimensions du tableau. C'est un tuple d'entiers indiquant la taille du tableau dans chaque dimension. Pour une matrice avec n lignes et m colonnes, shape sera (n,m). La longueur du tuple shape est donc le nombre d'axes, ndim.ndarray.size le nombre total d'éléments du tableau. Il est égal au produit des éléments de la forme.
Une mise en garde, cependant. Notez que np.array(None).size renvoie 1 ! C'est parce que a.size est équivalent à np.prod(a.shape), np.array(None).shape est (), et un produit vide est 1.
>>> import numpy as np
>>> np.array(None).size
1
>>> np.array(None).shape
()
>>> np.prod(())
1.0
Par conséquent, j'utilise ce qui suit pour tester si un tableau numpy a des éléments :
>>> def elements(array):
... return array.ndim and array.size
>>> elements(np.array(None))
0
>>> elements(np.array([]))
0
>>> elements(np.zeros((2,3,4)))
24
Un tableau contenant les None
n'est pas un tableau vide, voir les réponses ici pour plus de détails
Pourquoi voudrions-nous vérifier si un tableau est empty
? Les tableaux ne croissent ou ne diminuent pas comme les listes. En commençant avec un tableau "vide", et en augmentant avec np.append
est une erreur fréquente des novices.
Utilisation d'une liste dans if alist:
dépend de sa valeur booléenne :
In [102]: bool([])
Out[102]: False
In [103]: bool([1])
Out[103]: True
Mais essayer de faire la même chose avec un tableau produit (dans la version 1.18) :
In [104]: bool(np.array([]))
/usr/local/bin/ipython3:1: DeprecationWarning: The truth value
of an empty array is ambiguous. Returning False, but in
future this will result in an error. Use `array.size > 0` to
check that an array is not empty.
#!/usr/bin/python3
Out[104]: False
In [105]: bool(np.array([1]))
Out[105]: True
et bool(np.array([1,2])
produit la fameuse erreur d'ambiguïté.
La réponse acceptée suggère size
:
In [11]: x = np.array([])
In [12]: x.size
Out[12]: 0
Mais je (et la plupart des autres) vérifie le shape
plus que le size
:
In [13]: x.shape
Out[13]: (0,)
Un autre élément en sa faveur est qu'il se "mappe" sur une carte de l'UE. empty
liste :
In [14]: x.tolist()
Out[14]: []
Mais il y a d'autres tableaux avec 0 size
qui ne sont pas "vides" dans ce dernier sens :
In [15]: x = np.array([[]])
In [16]: x.size
Out[16]: 0
In [17]: x.shape
Out[17]: (1, 0)
In [18]: x.tolist()
Out[18]: [[]]
In [19]: bool(x.tolist())
Out[19]: True
np.array([[],[]])
est également de taille 0, mais de forme (2,0) et len
2.
Bien que le concept d'un empty
est bien définie, une empty array
n'est pas bien défini. Une liste vide est égale à une autre. On ne peut pas en dire autant d'une size 0
le tableau.
La réponse dépend vraiment de
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
6 votes
len(array( [] ))
est égal à 0.len(array( [0] )
est de 1.3 votes
Voulez-vous tester un tableau de longueur nulle, un tableau contenant tous les zéros, ou les deux ? Quelle est votre définition de "vide" ?
15 votes
@StevenRumbalski : Mais
len(array([[]])
est 1 aussi !0 votes
len()
donne le nombre de dimensions dans le premier axe. Mais un tableau peut avoir une dimension non nulle sur le premier axe et rester vide s'il a une dimension nulle sur un autre axe.size
est meilleure car elle est le produit de tous les axes.