2016-11-14 60 views

回答

1

它看起來你可以像實現它:

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

如果陣列很大,應該避免將過多的陣列(如在一些其他的答案) 。因此,它應該比其他答案稍微快一點(但是沒有經過測試)。

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.data'代替'a' – Octavius

2

如果你有權訪問Numba(或者是cython),你可以寫下如下的代碼,這對於捕獲非二進制數組會非常快,因爲它會立即縮短計算/停止,而不是繼續所有元素:

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 

無需像Numba或用Cython加速器的幫助下在純Python運行,這使得這種方法過於緩慢。

時序:

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

由於只有在數據單迴路:

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

請注意,這不適合浮點D型工作。

如果值是保證非負就可以得到短路行爲:

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

這個方法(總是)在數據分配相同的形狀參數的一個臨時數組,似乎環比第一種方法慢。

相關問題