2017-06-07 11 views

答えて

3

1次元配列の場合、組み込みのPython-any -functionは、boolにキャスト可能なアイテム(および1次元配列はこれらの条件を満たします)ではなく、多次元配列のiterableを必要とするだけです動作しません。

>>> import numpy as np 

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

>>> np.any(np.ones((10, 10))) 
True 

あなたが最初の次元を反復配列の反復処理場合は、多次元配列を持っている場合、あなたは各反復でarray(非数)を取得しますので、だこと。これらのarrayは、boolにキャストできません。したがって、例外がスローされます。

しかし、それは入力型(array)の意識だと、それはそのanyニーズ反復のpythonのを避けることができるので、np.anyanyよりもアレイ上(ほとんどの場合)高速になります。

In [0]: arr = np.zeros((1000)) 

In [1]: %timeit any(arr)  
Out[1]: 215 µs ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

In [2]: %timeit np.any(arr) 
Out[2]: 31.2 µs ± 1.41 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

副題として、おそらくany(np.zeros(4))>0の代わりにany(np.zeros(4) > 0)を使用したかったでしょう。 anyの結果がゼロ以上である(True任意の要素がないゼロの場合)は、第2のか否かをチェックしながら

最初のチェックは、あなたの配列内の任意の要素は、ゼロ以上である場合。

+0

良い説明とタイミングの例。あなたはサイドノートについて確かですか?任意の(np.zeros(4)).__ __(0) '==>' True'、 'any(np.zeros(4)).__ lt __(0)' ==> 'False'などです。 「要素が等しいか等しいかどうかをチェックする」と同じです。 – salient

+1

'>'のような比較演算子と算術演算子は、配列に関する要素ごとの操作/チェックを行うので、私はかなり確信しています。あなたは、 'any'の結果が' 0'より大きいかどうかをチェックしたいことを除いては、たとえば、 '' any(np.array([ - 1,0,0])> 0''は 'True'を返しますが、' 'any(np.array([、1,0、0] '。それはあなたが必要としている(そしてあなたが言っていない)ことによるので、それは私が間違っているかもしれません。 :) – MSeifert

+0

ああ、区別を参照してください:) – salient

2

numpy配列はiterableです。これはすべて組み込みのanyが引数を期待しています。 anyは、反復可能な要素のすべてが偽であればFalseを返します。すべてがゼロです。次に、比較False > 0Falseとなり、観測値が得られます。

関連する問題