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
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.
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.
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
@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:
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.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
e bool(np.array([1,2])produz o infame erro de ambiguidade.
len(array( [] ))
é 0.len(array( [0] )
é 1.len(array([[]])
é 1!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.Respostas:
Você sempre pode dar uma olhada no
.size
atributo. É definido como um número inteiro e é zero (0
) quando não há elementos na matriz:fonte
http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2
fonte
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.
Portanto, eu uso o seguinte para testar se uma matriz numpy tem elementos:
fonte
None
objeto não é um array vazio, veja as respostas aqui para mais detalhesNone
objeto. Veja a sua forma.()
são matrizes escalares, que contêm um elemento (o escalar). Neste exemplo, o escalar éNone
(None
nã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.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 issonp.append
é um erro frequente de iniciante.Usando uma lista nas
if alist:
dobradiças de seu valor booleano:Mas tentar fazer o mesmo com uma matriz produz (na versão 1.18):
e
bool(np.array([1,2])
produz o infame erro de ambiguidade.fonte