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

时间:2016-04-07 08:16:03

标签: python numpy boolean

我正在尝试计算False中的np.array值,如下所示:

import numpy as np
a = np.array([[True,True,True],[True,True,True],[True,False,False]])

我通常使用这种方法:

number_of_false=np.size(a)-np.sum(a)

有更好的方法吗?

5 个答案:

答案 0 :(得分:8)

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

>>> np.size(a) - np.count_nonzero(a)
2

答案 1 :(得分:6)

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

%%timeit中使用jupyter和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
.

明显的赢家是 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

答案 2 :(得分:2)

这样就可以了:

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

也许有其他更快或更好的方式。

答案 3 :(得分:2)

另一种选择是:

np.bitwise_not(a).sum()

更短,但可能不太清楚:

(~a).sum()

答案 4 :(得分:1)

计数错误比较的数量

number_of_false = np.size(out_putArray) - np.count_nonzero(out_putArray[0] >= out_putArray[1])

真正比较的次数计数

number_of_true = np.count_nonzero(out_putArray[0] >= out_putArray[1])