在2D的numpy数组中,最有效(和Pythonic)的计算False值的方式是什么?

9

我正在尝试计算类似于以下的 np.array 中的 False 值:

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)

有更好的方法吗?


使用 numpy.count_nonzero 怎么样? - Antti Haapala -- Слава Україні
@AnttiHaapala使用numpy.sum也是一样的,只需计算True的数量。 - G M
5个回答

18

使用count_nonzero函数来计算非零值(例如不是False的值):

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

1
是的,但这不是我更多或更少使用的相同解决方案吗? - G M
而根据我的小型基准测试,优化了一个数量级。 :) - Reblochon Masque

13

询问确切需求肯定是最清晰的方式,但并不意味着这是最高效的方式:

在使用Python 2.7和Jupyter时,使用%%timeit对提供的答案进行测试,可以得出一个明确的获胜者:

    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次循环,最佳3次的结果为27微秒每个循环。

顺便提一下:a.sizenp.size(a) 快大约10倍。另一个基准测试的替代方法可能是 np.count_nonzero(~a),虽然这不是最有效的方法。 - BottleNick

5
这样做可以实现这个功能: len(np.where(a==False)) 也许还有其他更快或更好看的方法。

3

一个替代方案是:

np.bitwise_not(a).sum()

甚至更简洁的表述是:
(~a).sum()

0

统计假比较的数量

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])

“out_putArray”是什么?你的代码似乎无法工作。应该是number_of_true = np.count_nonzero(arr1 >= arr2),不使用索引。 - Muhammad Yasirroni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接