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

169

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( [] ):
Kicsi Mano
la source
6
len(array( [] ))est 0. len(array( [0] )est 1.
Steven Rumbalski
3
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»?
John Lyon
12
@StevenRumbalski: Mais len(array([[]])c'est 1 aussi!
strpeter
len()donne le nombre de dimensions dans le premier axe. Mais un tableau peut avoir une dimension non nulle dans le premier axe mais toujours être vide s'il a une dimension nulle dans un autre axe. sizeest meilleur car il est le produit de tous les axes.
asmeurer le

Réponses:

303

Vous pouvez toujours jeter un œil à l' .sizeattribut. Il est défini comme un entier et vaut 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
JoshAdel
la source
4
C'est génial pour numpy, mais c'est dommage qu'il soit considéré comme impythonique pour les listes. Consultez la discussion pour les listes: stackoverflow.com/questions/53513/ ... Ce serait bien d'utiliser le même modèle pour les tableaux et les listes numpy.
eric
Le code NumPy en général ne fonctionne pas correctement sur les listes, ou vice versa. Vous devez écrire le code d'une manière différente si vous utilisez des listes et des tableaux NumPy.
asmeurer le
22

http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2

L'objet principal de NumPy est le tableau multidimensionnel homogène. Dans Numpy, les dimensions sont appelées axes. Le nombre d'axes est le rang. La classe de tableau de Numpy s'appelle ndarray. Il est également connu sous le nom de tableau d'alias. Les attributs les plus importants d'un objet ndarray sont:

ndarray.ndim
le nombre d'axes (dimensions) du tableau. Dans le monde Python, le nombre de dimensions est appelé rang.

ndarray.shape
les dimensions du tableau. Il s'agit d'un tuple d'entiers indiquant la taille du tableau dans chaque dimension. Pour une matrice avec n lignes et m colonnes, la forme sera (n, m). La longueur du tuple de forme est donc le rang, ou le nombre de dimensions, ndim.

ndarray.size
le nombre total d'éléments du tableau. Ceci est égal au produit des éléments de forme.

Colonel Panic
la source
10

Une mise en garde, cependant. Notez que np.array (None) .size renvoie 1! En effet, 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 contient 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
user10178557
la source
8
Un tableau contenant l' Noneobjet n'est pas un tableau vide, voir les réponses ici pour plus de détails
DrBwts
1
@DrBwts qui n'est pas pertinent pour cette réponse.
vidstige
@DrBwts Son tableau ne contient pas l' Noneobjet. Regardez sa forme.
Navin
Les tableaux de forme ()sont des tableaux scalaires, qui contiennent un élément (le scalaire). Dans cet exemple, le scalaire est None( Nonen'a pas de signification particulière, il s'agit simplement d'un tableau d'objets). Cela dépend de ce que vous faites, mais vous voudrez probablement considérer les tableaux scalaires comme n'étant pas vides.
asmeurer le
-1

Pourquoi voudrions-nous vérifier si un tableau l'est empty? Les tableaux ne grandissent pas ou ne rétrécissent pas de la même manière que les listes. Commencer par un tableau «vide» et croître avec np.appendest une erreur de novice fréquente.

Utilisation d'une liste dans les if alist:charnières sur sa valeur booléenne:

In [102]: bool([])                                                                       
Out[102]: False
In [103]: bool([1])                                                                      
Out[103]: True

Mais essayer de faire de même 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 tristement célèbre erreur d'ambiguïté.

hpaulj
la source