243 votes

Comment puis-je vérifier si un tableau numpy est vide ou non ?

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([]):

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 !

409voto

JoshAdel Points 15911

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

5 votes

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.

1 votes

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.

9 votes

Un équivalent rapide if not a.size:

28voto

Colonel Panic Points 18390

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.

23voto

user10178557 Points 351

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

13 votes

Un tableau contenant les None n'est pas un tableau vide, voir les réponses ici pour plus de détails

2 votes

@DrBwts ce n'est pas pertinent pour cette réponse.

0 votes

@DrBwts Son tableau ne contient pas le None objet. Regardez sa forme.

-1voto

hpaulj Points 6132

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é.

editar

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

  • Que voulez-vous dire par "vide" ?
  • pour quoi faites-vous vraiment le test ?

Prograide.com

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.

Powered by:

X