web-dev-qa-db-ja.com

変数がNoneまたはnumpy.arrayであるかどうかを確認するときのValueError

変数が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()
74
rkjt50r983

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

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

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

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

テストは==ではなく、isでなければならないことに注意してください。 isはオブジェクトIDテストです。 ==は、引数が何を言っていても、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:
    ...    
128
Jerfov2

オブジェクトに形状があるかどうかを確認できます

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

似たようなa is not Noneを実行しようとすると、同じ問題が発生します。Numpyは、a.anyまたはa.allを使用する必要があると文句を言います。回避策は次のとおりです。

if not (a is None):
    pass

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

0
mimoralea