numpyの配列が与えられている場合、0と1しか含まれていないとどうすればよいでしょうか? 実装されているメソッドはありますか?numpy配列がバイナリであるかどうかを調べる速い方法(0と1のみを含む)
3
A
答えて
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
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
この方法(常に)の引数として同じ形状の一時配列を割り当ててデータをループに思えます最初の方法よりも遅い。
関連する問題
- 1. php配列が0以上の値を含むかどうかを調べる?
- 2. numpy配列に0と1を書き込む最も速い方法
- 3. Javaでバイト配列がすべて0であるかどうかを調べる方法
- 4. numpy:0を含むパディング配列
- 5. 配列要素が空であるかどうかを調べる方法は?
- 6. 配列が1次元であるかどうかを調べる関数
- 7. 配列がスタックにあるかどうかを調べる方法は?
- 8. dataGridに列が含まれているかどうかを調べる方法
- 9. 文字列に配列内のオブジェクトが含まれているかどうかを調べる方法は?
- 10. ポインタマップ内のポインタが0でないかどうかを調べる方法
- 11. numpy配列がnumpyマスク配列であるかどうかをチェック
- 12. PHP:配列に文字列を含む文字列があるかどうかを調べるにはどうすればよいですか?
- 13. 配列が2次元配列にあるかどうかを調べる
- 14. LinearLayoutが小さすぎて子を含むことができないかどうかを調べる方法
- 15. stdinが空であるかどうかを調べる方法
- 16. matlabで行列が空であるかどうかを調べる方法は?
- 17. 指定された配列値が別の配列値と一致するかどうかを調べる最速の方法はありますか?
- 18. Python配列に数字の集合リストのみが含まれているかどうかを調べる
- 19. 言語がLL(1)かどうかを調べる方法は?
- 20. 言語がLL(1)かどうかを調べる方法は?
- 21. PowerShell:SQLクエリで0行が返されるかどうかを調べる方法
- 22. 配列内の値が真であるかどうかを調べる
- 23. Java:arraylistがフィボナッチ配列の一部であるかどうかを調べる
- 24. ジェネリック型の配列がMaxHeapであるかどうかを調べるアルゴリズム
- 25. ある配列の要素が別の配列の要素数であるかどうかを調べる
- 26. 配列が美しいかどうかを調べる
- 27. Laravelでリクエスト配列が空であるかどうかを調べる
- 28. 配列のif文です。配列の整数が0かどうかを調べるには?
- 29. 整数が0で終わるかどうかを調べる
- 30. Ruby:入れ子になった配列に配列が含まれているかどうかを調べる
これは 'scipy'スパース行列でも動作します。' a'の代わりに 'a.data'を使用してください。 – Octavius