2016-11-14 5 views

答えて

1

それはあなたのようなもので、それを達成することができますになります。あなたの配列が大きい場合、それは(いくつかの他の回答のように)あまりにも多くの配列をコピーすることは避けるべき

np.array_equal(a, a.astype(bool)) 

。したがって、おそらく他の回答よりもやや速いはずです(しかしテストされません)。これはポイントDTYPEをフローティング機能しないこと

0 <= np.bitwise_or.reduce(ar) <= 1 

注:データの上にのみ単一のループで

6

少数のアプローチ -

((a==0) | (a==1)).all() 
~((a!=0) & (a!=1)).any() 
np.count_nonzero((a!=0) & (a!=1))==0 
a.size == np.count_nonzero((a==0) | (a==1)) 

ランタイムテスト -

In [313]: a = np.random.randint(0,2,(3000,3000)) # Only 0s and 1s 

In [314]: %timeit ((a==0) | (a==1)).all() 
    ...: %timeit ~((a!=0) & (a!=1)).any() 
    ...: %timeit np.count_nonzero((a!=0) & (a!=1))==0 
    ...: %timeit a.size == np.count_nonzero((a==0) | (a==1)) 
    ...: 
10 loops, best of 3: 28.8 ms per loop 
10 loops, best of 3: 29.3 ms per loop 
10 loops, best of 3: 28.9 ms per loop 
10 loops, best of 3: 28.8 ms per loop 

In [315]: a = np.random.randint(0,3,(3000,3000)) # Contains 2 as well 

In [316]: %timeit ((a==0) | (a==1)).all() 
    ...: %timeit ~((a!=0) & (a!=1)).any() 
    ...: %timeit np.count_nonzero((a!=0) & (a!=1))==0 
    ...: %timeit a.size == np.count_nonzero((a==0) | (a==1)) 
    ...: 
10 loops, best of 3: 28 ms per loop 
10 loops, best of 3: 27.5 ms per loop 
10 loops, best of 3: 29.1 ms per loop 
10 loops, best of 3: 28.9 ms per loop 

彼らのランタイムが同等であるように見えます。

+2

これは 'scipy'スパース行列でも動作します。' a'の代わりに 'a.data'を使用してください。 – Octavius

2

Numba(またはcython)にアクセスできる場合は、次のように書くことができます。非バイナリ配列をキャッチする方がはるかに高速です。すべてを続行するのではなく、計算/要素:NumbaまたはCythonのような加速器の助けを借りずに、純粋なpythonでこれを実行する

import numpy as np 
import numba as nb 

@nb.njit 
def check_binary(x): 
    is_binary = True 
    for v in np.nditer(x): 
     if v.item() != 0 and v.item() != 1: 
      is_binary = False 
      break 

    return is_binary 

このアプローチは法外遅くなります。

タイミング:

a = np.random.randint(0,2,(3000,3000)) # Only 0s and 1s 

%timeit ((a==0) | (a==1)).all() 
# 100 loops, best of 3: 15.1 ms per loop 

%timeit check_binary(a) 
# 100 loops, best of 3: 11.6 ms per loop 

a = np.random.randint(0,3,(3000,3000)) # Contains 2 as well 

%timeit ((a==0) | (a==1)).all() 
# 100 loops, best of 3: 14.9 ms per loop 

%timeit check_binary(a) 
# 1000000 loops, best of 3: 543 ns per loop 
+0

無効なものが最初に出現したかどうかを確認するために、 – Divakar

0

値が保証されている場合は負でないあなたは短絡動作を取得することができます:

try: 
    np.empty((2,), bool)[ar] 
    is_binary = True 
except IndexError: 
    is_binary = False 

この方法(常に)の引数として同じ形状の一時配列を割り当ててデータをループに思えます最初の方法よりも遅い。

関連する問題