Değişkenin Yok mu yoksa numpy.array mi olduğunu kontrol ederken ValueError


105

Değişkenin Yok mu yoksa numpy.array mi olduğunu kontrol etmek istiyorum. Bunu check_ayapmak için işlev uyguladım .

def check_a(a):
    if not a:
        print "please initialize a"

a = None
check_a(a)
a = np.array([1,2])
check_a(a)

Ancak bu kod ValueError'ı yükseltir. Basit yol nedir?

ValueError                                Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
      6 check_a(a)
      7 a = np.array([1,2])
----> 8 check_a(a)

<ipython-input-41-0201c81c185e> in check_a(a)
      1 def check_a(a):
----> 2     if not a:
      3         print "please initialize a"
      4 
      5 a = None

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

2
Bu ValueErroren yaygın numpysorulardan biridir. Bu not a, (bu durumda) 2 değerli bir boole dizisi oluşturduğu anlamına gelir . Bu boole dizisi bir ifkoşul olarak kullanılamaz ! is NoneAlternatif bilmek iyidir, ama aynı zamanda bu hatayı anlamalıdır.
hpaulj

@hpaulj: Tam olarak değil - aşırı yükleyemezsiniz not, bu nedenle hata notdiziyi tek bir boole olarak ele almaya çalışıp yapamayacağını öğrendiğinde gerçekleşir . Öyle olsaydı ~a, bu NumPy'nin aşırı yüklenmesini ifkullanırdı ve olumsuzlanmış diziyi tek bir boole olarak kullanmaya çalıştığında başarısız olurdu .
user2357112, Monica

Yanıtlar:


177

Olup not aolmadığını test etmek aiçin kullanmak None, diğer olası değerlerinin adoğruluk değerine sahip olduğunu varsayar True. Bununla birlikte, çoğu NumPy dizisinin bir doğruluk değeri yoktur ve notbunlara uygulanamaz.

Bir nesnenin olup olmadığını test etmek istiyorsanız None, en genel ve güvenilir yol, kelimenin tam anlamıyla aşağıdakilere iskarşı bir kontrol kullanmaktır None:

if a is None:
    ...
else:
    ...

Bu, doğruluk değerine sahip nesnelere bağlı değildir, bu nedenle NumPy dizileriyle çalışır.

Testin olması gerektiğini unutmayın is, değil ==.isbir nesne kimlik testidir. ==argümanlar ne derse desin ve NumPy dizileri bunun bir boole dizisi üreten bir yayınlanmış elementsel eşitlik karşılaştırması olduğunu söylüyor:

>>> a = numpy.arange(5)
>>> a == None
array([False, False, False, False, False])
>>> if a == None:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
 Use a.any() or a.all()

Diğer taraftan, bir nesnenin NumPy dizisi olup olmadığını test etmek istiyorsanız, türünü test edebilirsiniz:

# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
    ...
else:
    ...

Ayrıca , bu türdeki alt sınıflar için isinstancede dönecek Trueolan (eğer istediğiniz buysa) kullanabilirsiniz. Ne kadar korkunç ve uyumsuz np.matrixolduğunu düşünürsek , aslında bunu istemeyebilirsiniz:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    

4
"en iyi" çözüm hangisi?
Monica Heddneck

2

Çok benzer bir şey yapmaya çalışıyorsanız: a is not Noneaynı sorun ortaya çıkar. Yani, Numpy birinin a.anyveya kullanması gerektiğinden şikayet ediyor a.all.

Bir geçici çözüm yapmaktır:

if not (a is None):
    pass

Çok hoş değil ama işini yapıyor.


0

Nesnenin şekli olup olmadığını görebilirsiniz

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False

1
olumsuz oy verildi çünkü: diğer türler de şekil özelliğine sahip olabilir ve hatta farklı anlamları olabilir.
Herbert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.