Como posso verificar se uma matriz numpy está vazia ou não?


169

Como posso verificar se uma matriz numpy está vazia ou não?

Eu usei o código a seguir, mas isso falhará se a matriz contiver um zero.

if not self.Definition.all():

Essa é a solução?

if self.Definition == array( [] ):

6
len(array( [] ))é 0. len(array( [0] )é 1.
Steven Rumbalski

3
deseja testar uma matriz de comprimento zero, uma matriz contendo todos os zeros ou ambos? Qual é a sua definição de 'vazio'?
John Lyon

12
@StevenRumbalski: Mas também len(array([[]])é 1!
Strpeter

len()fornece o número de dimensões no primeiro eixo. Mas uma matriz pode ter uma dimensão diferente de zero no primeiro eixo, mas ainda estar vazia se tiver uma dimensão zero em outro eixo. sizeé melhor, pois é o produto de todos os eixos.
asmeurer 26/06

Respostas:


303

Você sempre pode dar uma olhada no .sizeatributo. É definido como um número inteiro e é zero ( 0) quando não há elementos na matriz:

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

if a.size == 0:
    # Do something when `a` is empty

4
Isso é ótimo para entorpecido, mas é lamentável que seja considerado não sintônico para listas. Confira a discussão para obter listas: stackoverflow.com/questions/53513/… Seria bom usar o mesmo padrão para matrizes e listas numpy.
eric

O código NumPy em geral não funciona corretamente em listas ou vice-versa. Você precisará escrever o código de uma maneira diferente se estiver usando listas vs. matrizes NumPy.
asmeurer 26/06

22

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

O principal objeto do NumPy é a matriz multidimensional homogênea. Em Numpy, as dimensões são chamadas de eixos. O número de eixos é classificação. A classe de array do Numpy é chamada ndarray. Também é conhecido pela matriz de alias. Os atributos mais importantes de um objeto ndarray são:

ndarray.ndim
o número de eixos (dimensões) da matriz. No mundo Python, o número de dimensões é chamado de classificação.

ndarray.shape
as dimensões da matriz. Esta é uma tupla de números inteiros, indicando o tamanho da matriz em cada dimensão. Para uma matriz com n linhas e m colunas, a forma será (n, m). O comprimento da tupla de forma é, portanto, a classificação, ou número de dimensões, ndim.

ndarray.size
o número total de elementos da matriz. Isso é igual ao produto dos elementos da forma.


10

Uma ressalva, no entanto. Observe que np.array (None) .size retorna 1! Isso ocorre porque a.size é equivalente a np.prod (a.shape), np.array (None) .shape é () e um produto vazio é 1.

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

Portanto, eu uso o seguinte para testar se uma matriz numpy tem 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

8
Uma matriz contendo o Noneobjeto não é um array vazio, veja as respostas aqui para mais detalhes
DrBwts

1
@DrBwts que não é relevante para esta resposta.
vidstige

@DrBwts Sua matriz não contém o Noneobjeto. Veja a sua forma.
Navin

Matrizes com forma ()são matrizes escalares, que contêm um elemento (o escalar). Neste exemplo, o escalar é None( Nonenão tem nenhum significado especial, é apenas uma matriz de objetos). Depende do que você está fazendo, mas é provável que você queira considerar matrizes escalares como não vazias.
asmeurer 26/06

-1

Por que queremos verificar se uma matriz é empty? As matrizes não aumentam ou diminuem da mesma forma que as listas. Começando com uma matriz 'vazia' e crescendo com isso np.appendé um erro frequente de iniciante.

Usando uma lista nas if alist:dobradiças de seu valor booleano:

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

Mas tentar fazer o mesmo com uma matriz produz (na versão 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

e bool(np.array([1,2])produz o infame erro de ambiguidade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.