変数がNoneまたはnumpy.arrayかどうかをチェックするときのValueError


104

変数がNoneまたはnumpy.arrayかどうかを確認したいと思います。check_aこれを行うための関数を実装しました。

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

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

しかし、このコードはValueErrorを発生させます。簡単な方法は何ですか?

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
これValueErrorは最も一般的なnumpy質問の1つです。これはnot a、(この場合)2つの値を持つブール配列を生成することを意味します。このブール配列はif条件として使用できません!is None代替は知って良いですが、あなたも、このエラーを理解する必要があります。
hpaulj

@hpaulj:不正解です-オーバーロードすることはできないため、配列を単一のブール値として処理しようとするとnotエラーが実際に発生し、notそれができないことがわかります。だった場合~a、NumPyのオーバーロードifを使用して、否定された配列を単一のブール値として使用しようとすると失敗します。
user2357112はモニカ

回答:


174

not aかどうかをテストするために使用すると、の他の可能な値がの真理値を持っているaNone想定されaますTrue。ただし、ほとんどのNumPy配列には真理値notがないため、それらに適用することはできません。

オブジェクトがNoneであるかどうかをテストする場合、最も一般的で信頼できる方法は、文字列isに対するチェックを文字通り使用することNoneです。

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

これは真理値を持つオブジェクトに依存しないため、NumPy配列で機能します。

テストはそうisではないことに注意してください==isオブジェクト同一性テストです。==引数がそうであると言うものは何でもあり、NumPy配列はそれがブロードキャストされた要素ごとの等価比較であると言って、ブール配列を生成します。

>>> 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()

反対に、オブジェクトがNumPy配列であるかどうかをテストする場合は、その型をテストできます。

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

を使用することもできますisinstance。これTrueにより、そのタイプのサブクラスも返されます(必要な場合)。ひどいと互換性np.matrixがないことを考えると、あなたは実際にはこれを望んでいないかもしれません:

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

4
「最良の」解決策はどれですか。
モニカヘドネック

2

非常に類似した何かを実行しようとしている場合:a is not None同じ問題が発生します。つまり、Numpyはa.anyorを使用する必要があると不平を言いますa.all

回避策は次のとおりです。

if not (a is None):
    pass

あまりきれいではありませんが、それは仕事をします。


0

オブジェクトが形をしているかどうかを確認できます

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

1
なぜなら、他のタイプも同様にshape属性を持つことができ、それらが異なる意味を持つことさえあるからです。
ハーバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.