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
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.
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.
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
@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:
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.ReturningFalse, but in
future this will result in an error.Use`array.size >0` to
check that an array isnot empty.#!/usr/bin/python3Out[104]:FalseIn[105]: bool(np.array([1]))Out[105]:True
et bool(np.array([1,2])produit la tristement célèbre erreur d'ambiguïté.
len(array( [] ))
est 0.len(array( [0] )
est 1.len(array([[]])
c'est 1 aussi!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.size
est meilleur car il est le produit de tous les axes.Réponses:
Vous pouvez toujours jeter un œil à l'
.size
attribut. Il est défini comme un entier et vaut zéro (0
) lorsqu'il n'y a aucun élément dans le tableau:la source
http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2
la source
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.
Par conséquent, j'utilise ce qui suit pour tester si un tableau numpy contient des éléments:
la source
None
objet n'est pas un tableau vide, voir les réponses ici pour plus de détailsNone
objet. Regardez sa forme.()
sont des tableaux scalaires, qui contiennent un élément (le scalaire). Dans cet exemple, le scalaire estNone
(None
n'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.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 avecnp.append
est une erreur de novice fréquente.Utilisation d'une liste dans les
if alist:
charnières sur sa valeur booléenne:Mais essayer de faire de même avec un tableau produit (dans la version 1.18):
et
bool(np.array([1,2])
produit la tristement célèbre erreur d'ambiguïté.la source