¿Cómo puedo verificar si una matriz numpy está vacía o no?

169

¿Cómo puedo verificar si una matriz numpy está vacía o no?

Usé el siguiente código, pero esto falla si la matriz contiene un cero.

if not self.Definition.all():

¿Es esta la solución?

if self.Definition == array( [] ):
Kicsi Mano
fuente
66
len(array( [] ))es 0. len(array( [0] )es 1.
Steven Rumbalski
3
¿Desea probar una matriz de longitud cero, una matriz que contiene todos los ceros, o ambos? ¿Cuál es su definición de 'vacío'?
John Lyon
12
@StevenRumbalski: ¡Pero también len(array([[]])es 1!
strpeter
len()da el número de dimensiones en el primer eje. Pero una matriz puede tener una dimensión distinta de cero en el primer eje pero aún estar vacía si tiene una dimensión cero en otro eje. sizees mejor ya que es el producto de todos los ejes.
Asmeurer

Respuestas:

303

Siempre puedes echar un vistazo al .sizeatributo. Se define como un entero y es cero ( 0) cuando no hay elementos en la matriz:

import numpy as np
a = np.array([])

if a.size == 0:
    # Do something when `a` is empty
JoshAdel
fuente
44
Esto es genial para numpy, pero es desafortunado que se considere poco propónico para las listas. Consulte la discusión para las listas: stackoverflow.com/questions/53513/… Sería bueno usar el mismo patrón para matrices y listas numpy.
eric
El código NumPy en general no funciona correctamente en las listas o viceversa. Tienes que escribir el código de una manera diferente si estás usando listas contra matrices NumPy.
Asmeurer
22

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

El objeto principal de NumPy es la matriz multidimensional homogénea. En Numpy las dimensiones se llaman ejes. El número de ejes es rango. La clase de matriz de Numpy se llama ndarray. También es conocido por la matriz de alias. Los atributos más importantes de un objeto ndarray son:

ndarray.ndim
el número de ejes (dimensiones) de la matriz. En el mundo de Python, el número de dimensiones se conoce como rango.

ndarray.shape
las dimensiones de la matriz. Esta es una tupla de enteros que indica el tamaño de la matriz en cada dimensión. Para una matriz con n filas ym columnas, la forma será (n, m). La longitud de la tupla de forma es, por lo tanto, el rango, o número de dimensiones, ndim.

ndarray.size
el número total de elementos de la matriz. Esto es igual al producto de los elementos de la forma.

Coronel Panic
fuente
10

Sin embargo, una advertencia. Tenga en cuenta que np.array (None) .size devuelve 1! Esto se debe a que a.size es equivalente a np.prod (a.shape), np.array (None) .shape is () y un producto vacío es 1.

>>> import numpy as np
>>> np.array(None).size
1
>>> np.array(None).shape
()
>>> np.prod(())
1.0

Por lo tanto, uso lo siguiente para probar si una matriz numpy tiene elementos:

>>> 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
usuario10178557
fuente
8
Una matriz que contiene el Noneobjeto no es una matriz vacía, vea las respuestas aquí para obtener más detalles
DrBwts
1
@DrBwts que no es relevante para esta respuesta.
vidstige
@DrBwts Su matriz no contiene el Noneobjeto. Mira su forma.
Navin
Las matrices con forma ()son matrices escalares, que contienen un elemento (el escalar). En este ejemplo, el escalar es None( Noneno tiene ningún significado especial, esto es solo una matriz de objetos). Depende de lo que esté haciendo, pero lo más probable es que desee considerar que las matrices escalares no estén vacías.
Asmeurer
-1

¿Por qué querríamos verificar si una matriz es empty? Las matrices no crecen ni se reducen de la misma manera que las listas. Comenzar con una matriz 'vacía' y crecer con np.appendun error frecuente de principiante.

Usando una lista en if alist:bisagras en su valor booleano:

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

Pero tratar de hacer lo mismo con una matriz produce (en la versión 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

y bool(np.array([1,2])produce el infame error de ambigüedad.

hpaulj
fuente