給定一個numpy數組,如何快速判斷它是否只包含0和1? 有沒有實施的方法?檢查numpy數組是否是二進制的快速方法(僅包含0和1)
3
A
回答
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
如果你有權訪問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
這個方法(總是)在數據分配相同的形狀參數的一個臨時數組,似乎環比第一種方法慢。
相關問題
- 1. Javascript:檢查元素是否在二維數組中的快速方法?
- 2. 檢查輸入是否爲二進制並且包含兩個1
- 3. 檢查數組是否包含數字(用0發行)
- 4. 檢查是否一個數組包含(僅)數值
- 5. 檢查一個二進制數是否在特定位置有'0'或'1'
- 6. 檢查數組是否包含false?
- 7. 如何檢查數字是否是二進制和的結果?
- 8. 快速計算二進制numpy數組的質心
- 9. Numpy:檢查數組中的某個位是否設置爲1或0?
- 10. 檢查PHP中的值是否只包含數字的最快方法?
- 11. 如何檢查一個字符串是否包含二進制數據?
- 12. Visual Basic - 函數來檢查數字是否是二進制的
- 13. 算法:什麼是檢查集合包含的最快方法?
- 14. 檢查numpy數組是否被屏蔽
- 15. 檢查對話框是否關閉的快速方法?
- 16. 檢查頁面是否在線的快速方法
- 17. 檢查是否包含jQuery
- 18. 基於元素包含在二進制矩陣中的快速數組操作
- 19. 查看數組是否包含對象的更好方法?
- 20. 快速檢查anyObject的數組是否有價值
- 21. 如何檢查是否一個數組包含浮法:: NAN
- 22. 關於C - >數組[1] [0]和數組[0] [1]中的二維數組是否相同?
- 23. Android:檢查字符串是否包含數組中的任何值的方法?
- 24. 檢查Python數組是否只包含一組數字集
- 25. 檢查Postgres數組是否按順序包含子數組
- 26. 如何檢查數組是否包含空數組?
- 27. 檢查實例化視圖是否包含任何行的最快方法
- 28. Java - 檢查一個字符串是否包含double值的最快方法
- 29. 檢查圖像是否包含任何(半)透明像素的最快方法?
- 30. 將1和0的數組轉換爲二進制變量
這也適用於'scipy'稀疏矩陣,只需使用'a.data'代替'a' – Octavius