1. ホーム
  2. python

[解決済み] 変数がNoneかnumpy.arrayか確認する際にValueErrorが発生する。

2022-05-06 13:51:17

質問

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

解決方法は?

使用方法 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:
    ...