変数が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
を使用してa
がNone
であるかどうかをテストするには、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:
...
オブジェクトに形状があるかどうかを確認できます
def check_array(x):
try:
x.shape
return True
except:
return False
似たようなa is not None
を実行しようとすると、同じ問題が発生します。Numpyは、a.any
またはa.all
を使用する必要があると文句を言います。回避策は次のとおりです。
if not (a is None):
pass
あまりきれいではありませんが、それは仕事をします。