最有效(和pythonic)的方法来计算2D numpy数组中的False值?

G M*_*G M 2 python boolean numpy

我试图像这样计算False价值np.array:

import numpy as np
a = np.array([[True,True,True],[True,True,True],[True,False,False]])
Run Code Online (Sandbox Code Playgroud)

我通常使用这种方法:

number_of_false=np.size(a)-np.sum(a)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Ant*_*ala 10

使用count_nonzero计数非零(例如,不False)值:

>>> np.size(a) - np.count_nonzero(a)
2
Run Code Online (Sandbox Code Playgroud)


Reb*_*que 6

更清楚的是肯定要问确切需要什么,但这并不意味着它是最有效的:

使用%%timeitjupyter与Python 2.7上,提出答案给出了一个明确的赢家:

    seq = [[True, True, False, True, False, False, False] * 10 for _ in range(100)]
    a = np.array(seq)

    np.size(a) - np.count_nonzero(a) 1000000 loops, best of 3: 1.34 µs per loop  - Antti Haapala
    (~a).sum()                        100000 loops, best of 3: 18.5 µs per loop  - Paul H
    np.size(a) - np.sum(a)             10000 loops, best of 3: 18.8 µs per loop  - OP
    len(a[a == False])                 10000 loops, best of 3: 52.4 µs per loop
    len(np.where(a==False))            10000 loops, best of 3: 77 µs per loop    - Forzaa
.
Run Code Online (Sandbox Code Playgroud)

明显的赢家是Antti Haapala,其数量级为np.size(a) - np.count_nonzero(a)

len(np.where(a==False))似乎受到数组嵌套结构的惩罚; 1 D阵列的相同基准给出10000 loops, best of 3: 27 µs per loop


For*_*zaa 5

这会做到这一点:

len(np.where(a==False))

也许还有其他更快或看起来更好的方法。