检查numpy数组是否为二进制的快速方法(仅包含0和1)

SeF*_*SeF 9 python numpy

给定一个numpy数组,如果它只包含0和1,我怎么能弄清楚?有没有实施的方法?

Div*_*kar 11

几乎没有办法 -

((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))
Run Code Online (Sandbox Code Playgroud)

运行时测试 -

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
Run Code Online (Sandbox Code Playgroud)

他们的运行时似乎是可比较的.

  • 这也适用于`scipy`稀疏矩阵,只需使用`a.data`代替`a` (3认同)

Tho*_*hel 5

看起来您可以通过以下方式实现它:

np.array_equal(a, a.astype(bool))
Run Code Online (Sandbox Code Playgroud)

如果您的数组很大,则应避免复制过多的数组(如其他答案)。因此,它可能应该比其他答案稍快一些(但是未经测试)。

  • @MehmetHakanKurtoğlu 这正是表达式背后的想法: 2 将被替换为 `True` 但之后比较将失败! (2认同)